通过减去两个不相等的浮点数可以得到0吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

在下面的例子中是否有可能被0(或者无穷)分割?

public double calculation(double a, double b)
{
     if (a == b)
     {
         return 0;
     }
     else
     {
         return 2 / (a - b);
     }
}

在正常情况下,它当然不会。但如果a并且b非常接近,可能会(a-b)导致0计算精度的下降?

请注意,这个问题是针对Java的,但我认为它适用于大多数编程语言。

提问于
用户回答回答于

在Java中,a - b永远不会等于0if a != b。这是因为Java要求支持非规格化数字的IEEE 754浮点运算。从规格

特别是,Java编程语言要求支持IEEE 754非标准化浮点数和逐渐下溢,这使得更容易证明特定数值算法的理想特性。如果计算结果是非规格化数字,则浮点运算不会“清零”。

如果一个FPU使用非规格化的数字,减去不相等的数字永远不会产生零(与乘法不同)。

对于其他语言,这取决于。例如,在C或C ++中,IEEE 754支持是可选的。

也就是说,表达式有可能2 / (a - b)溢出,例如with a = 5e-308b = 4e-308

用户回答回答于

public double calculation(double a, double b) {
     double c = a - b;
     if (c == 0)
     {
         return 0;
     }
     else
     {
         return 2 / c;
     }
}

扫码关注云+社区