代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

对于任何有限的浮点值,是否保证x-x==0?

  •  8
  • polygenelubricants  · 技术社区  · 14 年前

    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 是有限的,这有保证吗?

    1. x * -1 == -x
    2. x - x == 0

    (特别是我最感兴趣的是Java行为,但是对于其他语言的讨论也是受欢迎的。)


    我认为(也许我错了),答案是 对! 我认为归根结底就是是否存在有限的 IEEE-754 浮点值,其 additive inverse 总是可以精确计算的。由于例如 float double one dedicated bit just for the sign ,似乎是这样的,因为它只需要翻转符号位来查找加法逆(即 significand 应该完好无损)。

    相关问题

    2 回复  |  直到 14 年前
        1
  •  2
  •   Community leo1    7 年前

    虽然 x - x 可以给你 -0 而不是真的 0 , - 0 比较为等于 ,所以您可以放心地假设,任何有限数减去它本身都将等于零。

    Is there a floating point value of x, for which x-x == 0 is false? 了解更多详细信息。

        2
  •  3
  •   Pascal Cuoq    14 年前

    这两个等式都由IEEE754浮点保证,因为两者的结果 x-x x * -1 与具有相同精度的浮点数完全相同 x . 在这种情况下,无论舍入模式如何,都必须通过兼容的实现返回准确的值。

    编辑:与 .1 + .2 例子。

    你不能添加 .1 .2 在IEEE754中,因为您不能代表它们传递给 + . 加法、减法、乘法、除法和平方根返回唯一的浮点值,该值取决于舍入模式,直接低于、紧接着高于、最接近处理关系的规则,…,对中相同参数的操作结果 R . 因此,当结果 R )恰好可以表示为浮点数,不管舍入模式如何,此数字都自动成为结果。

    编译器允许您编写 0.1 作为不带警告的不同可表示数字的简写,与这些操作的定义是正交的。当你写作时 - (0.1) 例如, - 精确:它返回的参数正好相反。另一方面,它的论点不是 零点一 但是 double 您的编译器在其位置上使用的。

    简而言之,手术的另一部分原因 x * (-1) 确切地说是 -1 可以表示为 双重的 .