fp_contract pragma

确定是否将发生浮点收缩。 浮点收缩是一个指令,如 Fused-Multiply-Add (FMA),它将两个单独的浮点操作合并到单个指令中。 使用这些指令可能会影响浮点精度,因为处理器只能在两个操作后舍入一次,而不是在每个操作后舍入。

语法

#pragma fp_contract ( { on | off } )

备注

使用默认编译器选项时,fp_contractoff,这会告知编译器保留各个浮点指令。 将 fp_contract 设置为 on 以尽可能使用浮点收缩指令。 这是 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) 指令将其关闭。 即使目标处理器上提供了融合-乘法添加指令,此示例生成的代码也不会使用。 如果注释掉 #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 关键字