我遇到计算1.77e-308/10触发下溢异常的情况,但计算1.777e-308/10没有.这很奇怪,因为:
当浮点运算的真实结果的幅度(即,接近于零)小于目标数据类型中可表示为正常浮点数的最小值(来自算术下溢,维基百科)时,会发生下溢
换句话说,如果我们计算出x/y其中两个x和y的double,那么应该发生溢如果0 < |x/y| < 2.2251e-308(最小正正规化double是2.2251e-308).从理论上说,因此,无论是1.77e-308/10和1.777e-308/10应触发溢异常.该理论与我在下面的C程序中测试的内容相矛盾.
#include <stdio.h>
#include <fenv.h>
#include <math.h>
int main(){
double x,y;
// x = 1.77e-308 => underflow
// x = 1.777e-308 gives ==> no underflow
x=1.77e-308;
feclearexcept(FE_ALL_EXCEPT);
y=x/10.0;
if (fetestexcept(FE_UNDERFLOW)) {
puts("Underflow\n");
}
else puts("No underflow\n");
}
Run Code Online (Sandbox Code Playgroud)
为了编译程序,我使用了gcc program.c -lm; 我也尝试过Clang,它给了我相同的结果.任何解释?
[编辑]我通过这个在线IDE分享了上面的代码.