浮点运算

时间:2016-04-28 21:56:13

标签: floating-point ieee-754

我阅读有关浮点和舍入浮点运算期间发生的错误的信息。

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

我也知道,分母不是2的主要因子的实数不能完全表示为E.g 0.1 in binary is 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?

2 个答案:

答案 0 :(得分:2)

在IEEE754舍入到最近的偶数模式中,您有一些不错的属性 首先,对于任何有限浮点数x和n <54,(2 ^ n-1) x + x == 2 ^ n x 见Is 3*x+x always exact?

然后你也有(2 ^ n + 1) x == 2 ^ n x + 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)对于整数n从1到100的100中的65(对于此区间中的2的7次幂,总是如此),则为真。

答案 1 :(得分:1)

双精度的

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。

(我从binary converterbinary calculatorfloating-point converter获取了这些值。)