fp_contract pragma

浮動小数点の縮約が発生したかを判定します。 浮動小数点の縮約は、2 つの独立した浮動小数点演算を1つの命令に結合する Fused-Multiply-Add (FMA) などの命令です。 これらの命令を使用すると、浮動小数点の精度に影響を与える可能性があります。これは、プロセッサは、各操作の後に丸め処理を行うのではなく、両方の操作の後に 1 回だけ丸め処理を実行するためです。

構文

#pragma fp_contract ( { on | off } )

解説

既定のコンパイラ オプションを使用する場合、 fp_contract is は off、個々の浮動小数点命令を保持するようにコンパイラに指示します。 可能な限り浮動小数点の縮約命令を使用するには、fp_contracton に設定します。 この動作は、Visual Studio 2022 バージョン 17.0 の新機能です。 以前のコンパイラ バージョンでは、 fp_contract 既定値は on.

既定のコンパイラ オプションを使用する場合、 fp_contract 次の値を指定します on。 この設定は、可能な場合は浮動小数点収縮命令を使用するようにコンパイラに指示します。 個々の浮動小数点命令を保持するには、fp_contractoff に設定します。 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

関連項目

pragma ディレクティブと __pragma および _Pragma キーワード