我阅读有关浮点和舍入浮点运算期间发生的错误的信息 .
我阅读了很多关于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 回答
在IEEE754舍入到最近的偶数模式,您有一些不错的属性 .
首先,对于任何有限浮点数x和n <54,(2 ^ n-1)x x == 2 ^ nx见Is 3*x+x always exact?
然后你也有(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)对于整数n从1到100的100中的65(对于此区间中的2的7次幂,总是如此)是真的 .
双精度中的0.1是二进制的0.0001100110011001100110011001100110011001100110011001101 . 让我们逐步完成二进制文件,看看发生了什么:
因此,由于四舍五入的累积,0.1增加五次变为0.5 .
(我从binary converter,binary calculator和floating-point converter获得了这些值 . )