fp_contract
pragma
判斷是否進行浮點收縮。 浮點收縮是一個指令,例如 Fused-Multiply-Add (FMA),可將兩個不同的浮點運算合併成單一指令。 使用這些指令可能會影響浮點精確度,因為處理器在每次作業之後都只能四捨五入一次。
語法
#pragma fp_contract (
{on
|off
})
備註
當您使用預設編譯程式選項時, fp_contract
是 off
,它會指示編譯程式保留個別的浮點指令。 設定 fp_contract
為 on
以盡可能使用浮點收縮指示。 此行為是Visual Studio 2022 17.0版的新功能。 在舊版編譯程式中, fp_contract
預設為 on
。
當您使用預設編譯程式選項時, fp_contract
是 on
。 此設定會告知編譯程式盡可能使用浮點合約指示。 設定 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