floating-point - 两个不相等的 float 相减是否可以得到0?

标签 floating-point double floating-accuracy ieee-754

在下面的例子中是否可以除以 0(或无穷大)?

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

当然,在正常情况下不会。但是,如果 ab 非常接近,由于精度 (a-b) 会导致 0 吗?计算?

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

最佳答案

在 Java 中,如果 a != ba - b 永远不会等于 0。这是因为 Java 强制要求支持非规范化数字的 IEEE 754 浮点运算。来自 spec :

In particular, the Java programming language requires support of IEEE 754 denormalized floating-point numbers and gradual underflow, which make it easier to prove desirable properties of particular numerical algorithms. Floating-point operations do not "flush to zero" if the calculated result is a denormalized number.

如果 FPUdenormalized numbers一起工作,减去不等数永远不会产生零(与乘法不同),另请参阅 this question .

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

也就是说,it is possible使表达式 2/(a - b) 溢出,例如使用 a = 5e-308b = 4e-308

关于floating-point - 两个不相等的 float 相减是否可以得到0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28474339/

相关文章:

arrays - Matlab:将双向量数组转换为字符串元胞数组

rust - 检查一个数字是否可以精确表示为 `f32`

ios - Swift:从 String 创建 double 型将 0000000000001 附加到结果数

java - Double.parseDouble() 异常

javascript - 有没有办法提高这个表达式的浮点精度?

math - float 学有问题吗?

math - float 学运算是否被破坏?

python - 打印任意数量的 float

c# - "(float)integer == integer"在 C# 中是否保证相等?

java - 是否有任何 JVM 的 JIT 编译器生成使用矢量化浮点指令的代码?