浮点值是不精确的,这就是为什么我们应该在比较中很少使用严格的数值相等。例如,在 Java 中会打印false
(如在 ideone.com 上看到的):
System.out.println(.1 + .2 == .3);
// false
通常比较浮点计算结果的正确方法是查看与某个期望值的绝对差是否小于某个可容忍的epsilon。
System.out.println(Math.abs(.1 + .2 - .3) < .00000000000001);
// true
问题是某些操作是否可以产生准确的结果。我们知道,对于任何非有限浮点值x
(即要么NaN
或无穷大),x - x
总是ALWAYS NaN
。
但如果x
是有限的,这是否有任何保证?
x * -1 == -x
x - x == 0
(特别是我对 Java 行为最感兴趣,但也欢迎讨论其他语言。)
对于它的价值,我认为(我可能在这里错了)答案是肯定的!我认为这归结为对于任何有限的 IEEE-754浮点值,它的加法逆是否总是可以精确计算。由于 egfloat
和double
有一个专门用于符号的位,因此似乎就是这种情况,因为它只需要翻转符号位即可找到加法逆元(即有效数字应保持不变)。