考虑以下代码:
#include <fenv.h>
#include <stdio.h>
int main()
{
#pragma STDC FENV_ACCESS ON
1.0/0.0;
printf("%x\n", fetestexcept(FE_ALL_EXCEPT));
}
我希望它打印一个对应于 的非零值FE_DIVBYZERO
,但它打印 0。更改 to 的第二行main
会double x = 1.0/0.0;
给出预期的行为。这是允许的,还是一个错误?
编辑:对于它的价值,起初似乎在大多数现实世界的代码中,可能导致 fenv 异常的操作无法被优化出来,因此人们可以安全地执行大型计算并在最后检查是否有发生溢出、除零等。然而,当你考虑内联和优化时,事情变得一团糟,一个真正的问题出现了。如果这样的函数在由于常量参数而总是被零除的情况下被内联,gcc 可能会变得非常聪明,并从本质上优化整个内联函数而return INFINITY;
不会引发任何异常。