我进入计算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");
}
为了编译程序,我用了gcc program.c -lm
;我也试过Clang,这给了我相同的结果。任何解释?
[编辑]我已经通过this online IDE分享了上面的代码。
你可以显示y值吗? – Adam
您是如何确定机器上最小的标准化双倍数的? – Brick
在我的平台上是相反的:'1.77e-308'触发下溢,而1.777e-308;'不。 'g ++(Debian 4.9.2-10)4.9.2' – LPs