相关疑难解决方法(0)

什么时候发生下溢?

我遇到计算1.77e-308/10触发下溢异常的情况,但计算1.777e-308/10没有.这很奇怪,因为:

当浮点运算的真实结果的幅度(​​即,接近于零)小于目标数据类型中可表示为正常浮点数的最小值(来自算术下溢,维基百科)时,会发生下溢

换句话说,如果我们计算出x/y其中两个xydouble,那么应该发生溢如果0 < |x/y| < 2.2251e-308(最小正正规化double2.2251e-308).从理论上说,因此,无论是1.77e-308/101.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分享了上面的代码.

c floating-point floating-point-exceptions underflow

15
推荐指数
1
解决办法
2201
查看次数