原文链接:https://www.it566.top/index.php/wenzhang/java/2021/03/25/78400/
在下面的例子中,有可能被0除(或无穷大)吗?
1 2 3 4 5 6 7 8 9 10 11 |
public double calculation(double a, double b) { if (a == b) { return 0; } else { return 2 / (a - b); } } |
当然,在正常情况下不会。但是如果a和b很接近,由于计算的精确性,结果可能为0
虽然这个问题是针对Java的,但我认为它适用于大多数编程语言。
在java中,a – b永远不等于0如果a != b. 这是因为Java遵循IEEE754浮点运算规范。该规范指出:
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.
如果使用非规格化数字,相减不相等的数字永远不会产生零,.
对于其他语言,这要视情况而定。例如,在C或C++中,IEEE 754的支持是可选的。
也就是说,即使a!=b, a-b=0仍然是可能的表达式可能2 / (a – b)报错,例如用a = 5e-308和b = 4e-308.