Share via


fp_contract pragma

判斷是否進行浮點收縮。 浮點收縮是一個指令,例如 Fused-Multiply-Add (FMA),可將兩個不同的浮點運算合併成單一指令。 使用這些指令可能會影響浮點精確度,因為處理器在每次作業之後都只能四捨五入一次。

語法

#pragma fp_contract ( { on | off } )

備註

當您使用預設編譯器選項時, fp_contractoff ,它會指示編譯器保留個別的浮點指令。 設定 fp_contracton 以盡可能使用浮點收縮指示。 此行為是 Visual Studio 2022 17.0 版的新功能。 在舊版編譯器中, fp_contract 預設為 on

當您使用預設編譯器選項時, fp_contracton 。 此設定會告知編譯器盡可能使用浮點合約指示。 設定 fp_contract 為 以 off 保留個別的浮點指示。 在 Visual Studio 2022 17.0 版和更新版本中, fp_contract 預設為 off

如需浮點行為的詳細資訊,請參閱 /fp (指定浮點行為)。

其他浮點 pragma 指示詞包括:

範例

編譯 /fp:fast 程式選項預設會啟用合約,但 #pragma fp_contract (off) 此範例中的 指示詞會將其關閉。 即使目標處理器上提供,此範例所產生的程式碼也不會使用 fused-multiply-add 指令。 如果您將批註化 #pragma fp_contract (off) ,則產生的程式碼可能會在可用時使用 fused-multiply-add 指令。

// pragma_directive_fp_contract.cpp
// On x86 and x64 compile with: /O2 /fp:fast /arch:AVX2

#include <stdio.h>

// remove the following line to enable FP contractions
#pragma fp_contract (off)

int main() {
   double z, b, t;

   for (int i = 0; i < 10; i++) {
      b = i * 5.5;
      t = i * 56.025;

      z = t * i + b;
      printf("out = %.15e\n", z);
   }
}
out = 0.000000000000000e+00
out = 6.152500000000000e+01
out = 2.351000000000000e+02
out = 5.207249999999999e+02
out = 9.184000000000000e+02
out = 1.428125000000000e+03
out = 2.049900000000000e+03
out = 2.783725000000000e+03
out = 3.629600000000000e+03
out = 4.587525000000000e+03

另請參閱

Pragma 指示詞和 __pragma_Pragma 關鍵字