2016-04-28 119 views
0

我正在讀浮點數並捨去浮點運算期間發生的錯誤。浮點運算

我看了很多文章在IEEE 754單精度/雙精度格式。 我知道有符號位,8位(或)11位指數和23位(或)52位有效位以及隱含的前導位。

我也知道,在二進制是0.0001100110011實數,其分母不是2的一個主要因素不能完全表示對於如0.1 .....

我瞭解,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

你說你*不*得到一個舍入誤差積累'0.1'五次什麼時候? – MooseBoys

+0

我很困惑,當0.1加5次或者其他算法導致二進制中的精確表示數字時,錯誤的累積是否被拋棄?爲什麼? – chebus

+0

只有當新值導致不準確性中的不精確性丟失時。 –

回答

2

在IEEE754輪到最近的偶數模式,你有一些不錯的屬性。
首先,對於任何有限浮X和n < 54,(2^N-1)X + X3 == 2^N X 參見Is 3*x+x always exact?

然後,你也有(2^N + 1) X == 2^N X + X3
(以及只要2^N + 1是精確表示,正< 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

所以你的意思是說錯誤累計爲5 * 0.3,但是由於53位對於分數不夠用而捨棄該值而被拋棄,所以碰巧四捨五入的值恰好爲0.5,我正確嗎? 在這段時間裏,我無法得到2的7次冪的意思嗎? – chebus

+0

另一方面,我無法根據這個解釋找出爲什麼0.3 + 0.3現在等於0.6和6 * 0.1不等於0.6 – chebus

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得到這些值。)