浮点运算

我正在读浮点数并舍去浮点运算期间发生的错误。

我阅读了很多关于IEEE 754-单精度/双精度格式的文章。 我知道有符号位,8位(或)11位指数和23位(或)52位有效位以及隐含的前导位。

我也知道分母不是2的主要因子的实数不能精确地表示。例如,二进制中的0.1是0.0001100110011 ......

我明白0.1 + 0.1 + 0.1不等于0.3,因为舍入误差的累积。

另外0.5是二进制格式,因为它是1/2。 但我不明白给出上述舍入误差的积累,为什么0.1 + 0.1 + 0.1 + 0.1 + 0.1 = 0.5?


在IEEE754轮到最近的偶数模式,你有一些不错的属性。
首先,对于任何有限浮点数x和n <54,(2 ^ n-1)x + x == 2 ^ nx请参阅3 * x + x总是精确的吗?

那么你也有(2 ^ n + 1)x == 2 ^ nx + x
(只要2 ^ n + 1是完全可表示的,n <53)。

有了这些属性,你有

  • 0.1 + 0.1 == 2 * 0.1
  • 0.1 + 0.1 + 0.1 == 3 * 0.1
  • 0.1 + 0.1 + 0.1 + 0.1 == 4 * 0.1
  • 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 5 * 0.1
  • 这还不够,因为在这个阶段,0.1并不是1/10,所以没有证据证明5 * 0.1 == 0.5。
    例如3 * 0.1!= 0.3,以及5 * 0.3!= 0.15。

    所以在这里,这只是运气,圆整的错误湮没而不是累积。
    (n * 0.1 == n / 10.0)对于从1到100的整数n(对于在此间隔中的7个幂的总和为真)中的65个是正确的。


    双精度0.1是0.0001100110011001100110011001100110011001100110011001101二进制。 让我们逐步了解二进制添加以了解发生了什么:

      0.0001100110011001100110011001100110011001100110011001101
    +
      0.0001100110011001100110011001100110011001100110011001101
    -----------------------------------------------------------
      0.001100110011001100110011001100110011001100110011001101   (52 sig bits -- OK)
    +
      0.0001100110011001100110011001100110011001100110011001101
    -----------------------------------------------------------
      0.0100110011001100110011001100110011001100110011001100111  (54 sig bits -- must round to 53)
      0.0100110011001100110011001100110011001100110011001101     (rounded up)
    +
      0.0001100110011001100110011001100110011001100110011001101
    -----------------------------------------------------------
      0.0110011001100110011001100110011001100110011001100110101  (54 sig bits -- must round to 53)
      0.01100110011001100110011001100110011001100110011001101    (rounded down)
    +
      0.0001100110011001100110011001100110011001100110011001101
    -----------------------------------------------------------
      0.1000000000000000000000000000000000000000000000000000001 (55 sig bits -- must round to 53)
      0.1                                                       (rounded down)
    

    所以只是由于这些舍入的积累,0.1增加了五次就变成了0.5。

    (我从我的二进制转换器,二进制计算器和浮点转换器中获得了这些值。)

    链接地址: http://www.djcxy.com/p/85579.html

    上一篇: Floating point arithmetic

    下一篇: Maximum and minimum exponents in double