【发布时间】:2010-08-30 10:35:18
【问题描述】:
Floating point 的值是不精确的,这就是为什么我们应该在比较中很少使用严格的数值相等。例如,在 Java 中,这会打印出 false (as seen on 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 == -xx - x == 0
(特别是我对 Java 行为最感兴趣,但也欢迎讨论其他语言。)
对于它的价值,我认为(我可能在这里错了)答案是是的!我认为它归结为是否对于任何有限的IEEE-754 浮点值,它additive inverse 总是可以精确计算的。由于例如float 和 double 有 one dedicated bit just for the sign,这似乎是这种情况,因为它只需要翻转符号位即可找到加法逆(即 significand 应该保持不变)。
相关问题
【问题讨论】:
-
这个问题有点伤脑筋,所以我不能贡献,但我刚刚查看了您指向 ideone.com 的链接......这个网站看起来很酷!
-
哇!我投票结束我自己的欺骗问题。
标签: language-agnostic floating-point precision ieee-754 signedness