fp_contract
pragma
浮動小数点の縮約が発生したかを判定します。 浮動小数点の縮約は、2 つの独立した浮動小数点演算を1つの命令に結合する Fused-Multiply-Add (FMA) などの命令です。 これらの命令を使用すると、浮動小数点の精度に影響を与える可能性があります。これは、プロセッサは、各操作の後に丸め処理を行うのではなく、両方の操作の後に 1 回だけ丸め処理を実行するためです。
構文
#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)
ディレクティブは、それらをオフにします。 このサンプルから生成されたコードでは、ターゲット プロセッサで使用できる場合でも、融合乗算加算命令は使用されません。 #pragma fp_contract (off)
コメント アウトすると、生成されたコードで、使用できる場合は、融合乗算加算命令が使用される可能性があります。
// 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