浮点数 的值是不精确的,这就是为什么我们很少在比较中使用严格的数字相等性。例如,在 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浮点值,它的加法逆元是否总是可以精确计算。由于例如float
和double
具有一个专门用于符号的位, 这似乎是成立的,因为它只需要翻转符号位来找到加法逆元(即尾数应该保持不变)。