Consider the following code:
#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。将main
的第二行更改为double x = 1.0/0.0;
可以得到预期的行为。这是允许的,还是一个错误?
编辑:值得注意的是,起初看来,在大多数实际代码中,可能会导致fenv异常被引发的操作不能被优化掉,因此可以安全地执行大量计算,并在结束时检查是否发生了任何溢出、除零等情况。然而,当考虑到内联和优化时,事情变得混乱,一个真正的问题出现了。如果这样的函数在始终由于常量参数而最终分母为零的情况下被内联,gcc可能会变得非常聪明,将整个内联函数优化为return INFINITY;
而不引发任何异常。
-O0
。使用-O1
或更高版本,添加临时变量也无济于事;程序仍然以任何方式打印 0。 - R.. GitHub STOP HELPING ICE