fenv_access
禁用 () 或启用 () 可以更改标志测试和架构更改的优化。
#pragma fenv_access [ON | OFF]
备注
默认情况下, fenv_access 关闭。
有关浮点行为的更多信息,请参见 /fp(指定浮点行为)。
受 fenv_access 取决于此优化是:
全局常见子表达式清除
代码操作
常数可折叠的
其他浮点 pragma 包括:
示例
// pragma_directive_fenv_access_x86.cpp
// compile with: /O2
// processor: x86
#include <stdio.h>
#include <float.h>
#include <errno.h>
#pragma fenv_access (on)
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}
下面的示例适用于编译器生成 Itanium 处理器的输出文件。 /fp:precise 在值大于 FLT_MAX 的扩展精度保存中间结果 (3.402823466e+38F) 可以计算和由于该总和将具有 1.0,结果,则应,如果手动计算。 /fp:strict 在其源精度 (浮动) 保留中间结果,所以第一个将导致无限,保留在表达式中。
// pragma_directive_fenv_access_IPF.cpp
// compile with: /O2 /fp:precise
// processor: IPF
// compiling with /fp:precise prints 1.0F
// compile with /fp:strict to print infinity
#include <stdio.h>
float arr[5] = {3.402823465e+38F,
3.402823462e+38F,
3.402823464e+38F,
3.402823463e+38F,
1.0F};
int main() {
float sum = 0;
sum = arr[0] + arr[1] - arr[2] - arr[3] + arr[4];
printf_s("%f\n", sum);
}
如果评审从前面的示例中 #pragma fenv_access (on) ,请注意输出是不同的,因为编译器执行编译时计算,而不使用控件方法。
// pragma_directive_fenv_access_2.cpp
// compile with: /O2
#include <stdio.h>
#include <float.h>
int main() {
double z, b = 0.1, t = 0.1;
unsigned int currentControl;
errno_t err;
err = _controlfp_s(¤tControl, _PC_24, _MCW_PC);
if (err != 0) {
printf_s("The function _controlfp_s failed!\n");
return -1;
}
z = b * t;
printf_s ("out=%.15e\n",z);
}