【问题标题】:Floating point arithmetic浮点运算
【发布时间】:2016-08-23 21:33:02
【问题描述】:

我阅读了浮点运算过程中发生的浮点和舍入错误。

我阅读了很多关于 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 ?

【问题讨论】:

  • 你是说你在累积0.1 五次时会出现舍入错误?
  • 我很困惑是否在将 0.1 相加 5 次或任何其他导致二进制可精确表示的数字的算术运算时放弃累积误差,如果是这样,为什么?
  • 仅当新值导致不准确性丢失时。
  • 大概是您通过编写一些代码确定了这一点——如果您显示代码,我们可以更好地帮助您。
  • 瑞克,它在 java boolean b= 0.1+0.1+0.1+0.1+0.1== 0.5//true b=0.1+0.1+0.1==0.3//false 我的任务为什么是原因为 false 给出的也不适用于 true 情况,这是在算术上累积的错误的舍入,不完全代表数字

标签: floating-point ieee-754


【解决方案1】:

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

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

有了这些属性,你就有了

  • 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,对于 100 中的 65 是正确的(对于此区间中 2 的 7 次方,总是正确的)。

【讨论】:

  • 所以你的意思是说错误是累积为 5*0.3 但被舍入该值因为 53 位不足以容纳分数,而恰好舍入的值恰好是 0.5,我对么 ?在这个区间内我无法理解你所说的 2 的 7 次方是什么意思,?
  • 另一方面,我无法根据这个解释弄清楚为什么 0.3+0.3 现在等于 0.6 而 6*0.1 不等于 0.6
【解决方案2】:

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 获得这些值。)

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2012-03-19
    • 2013-06-12
    • 2014-12-05
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    相关资源
    最近更新 更多