pol*_*nts 8 language-agnostic floating-point precision ieee-754 signedness
浮点值是不精确的,这就是为什么我们应该很少在比较中使用严格的数字相等.例如,在Java中打印false(如ideone.com上所示):
System.out.println(.1 + .2 == .3);
// false
Run Code Online (Sandbox Code Playgroud)
通常,比较浮点计算结果的正确方法是查看某些预期值的绝对差值是否小于某个容许的epsilon.
System.out.println(Math.abs(.1 + .2 - .3) < .00000000000001);
// true
Run Code Online (Sandbox Code Playgroud)
问题是某些操作是否可以产生确切的结果.我们知道,任何非有限浮点值x(即要么NaN或无穷大),x - x是ALWAYS NaN.
但如果x是有限的,这是否有保证?
x * -1 == -xx - x == 0(特别是我对Java行为最感兴趣,但也欢迎其他语言的讨论.)
对于它的价值,我认为(我可能在这里错了)答案是肯定的!我认为这归结为是否对于任何有限的IEEE-754浮点值,其加法逆是总是可计算的.由于例如float并且double只有一个专用位用于符号,这似乎是这种情况,因为它只需要翻转符号位来找到加法逆(即有效数应保持不变).
虽然x - x可能会给你-0而不是 true 0,-0但比较等于0,所以你可以安全地假设任何有限数减去自身将比较等于零。
请参阅是否存在 x 的浮点值,其中 xx == 0 为 false?更多细节。