在下面的例子中是否可以除以 0(或无穷大)?
public double calculation(double a, double b)
{
if (a == b)
{
return 0;
}
else
{
return 2 / (a - b);
}
}
当然,在正常情况下不会。但如果a
and b
距离很近,可以(a-b)
结果是0
由于计算精度?
请注意,这个问题是针对 Java 的,但我认为它适用于大多数编程语言。
在爪哇,a - b
永远不等于0
if a != b
。这是因为 Java 强制要求支持非规范化数字的 IEEE 754 浮点运算。来自spec http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4:
特别是,Java 编程语言需要支持 IEEE 754 非规范化浮点数和渐进下溢,这使得更容易证明特定数值算法的所需属性。如果计算结果是非规格化数,则浮点运算不会“刷新为零”。
If an FPU http://en.wikipedia.org/wiki/Floating-point_unit与非规范化数字 http://en.wikipedia.org/wiki/Denormal_number,减去不等数永远不会产生零(与乘法不同),另请参阅这个问题 https://stackoverflow.com/questions/19053681/causing-underflow-in-ieee-754-floating-point-format-using-subtraction.
对于其他语言,这取决于。例如,在 C 或 C++ 中,IEEE 754 支持是可选的。
也就是说,有可能的 https://ideone.com/fXdwW3对于表达式2 / (a - b)
溢出,例如a = 5e-308
and b = 4e-308
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)