浮點數的運算精度丟失

2022-05-10 21:13:30 字數 1244 閱讀 8211

開啟python編譯器,輸入0.1+0.2, 期待的結果是0.3,但是輸出為:

0.30000000000000004

有點小尷尬,這是為什麼呢?

其實這設計到了計算機的浮點數儲存是以二進位制進行儲存的。

說二進位制不太形象,換成我們最長使用的十進位制和分數

1/5,使用小數表示為0.2,但是1/3,使用小數表示就是乙個無限迴圈小數:0.3333333, 也就是說,分數的 1/3+1/3=2/3,但如果使用小數:0.3333+0.3333=0.6666, 結果只會無限接近2/3,而不會等於2/3

因為把10分成三份,是不能夠整分的。同樣,把2分成十份,也不能整分。考慮到2整分只能分成兩份,也就是說,二進位制只能精確表示十進位制小數0.5

十進位製到二進位制的轉換在此略過。

十進位制的0.1,轉換成二進位制是:0.00011001100110011無限迴圈的小數,所以二進位制的小數運算,就會出現上面的1/3+1/3的情況,無法精確計算,只能夠近似表示。那為什麼python這些語言,我們在使用的時候沒有察覺到這個問題呢?因為編譯器自覺的幫我們做了近似的處理。

和十進位制無法精確表示分數的1/3同樣,二進位制也無法精確表示十進位制的小數。

為了方便分析,我們講計算機儲存的位元組數量進行縮減,我們假設小數點後只能儲存8為小數。

十進位制的0.1,轉換成二進位制為:0.00011001 (再反轉回十進位制,就會發現精度的丟失了,十進位制是:0.09765625)

十進位制的0.2,轉換成二進位制為:0.00110011 (反轉回十進位制,為:0.19921875)

加法運算:

十進位制

0.1+0.2=0.3

二進位制

0.00011001+0.00110011=0.01001100 (轉成十進位制:0.296875)

當然,計算機中儲存的位數要比8位多,python浮點數占用8個位元組,64位。但因為是無限小數,並不是位數多了就會準確。

那麼如何做這種精度的計算呢?其實很簡單,精度丟失是小數才會有,只要轉成整數,就不會有這個問題了。比如python中:

(1.0+2.0)/10

結果:0.3, 沒毛病。

當然,這個0.3也不是精確的0.3,但會在顯示過程進行精度轉換,通過整數運算,避免了小數運算過程中的丟失精度問題。

浮點數的運算精度丟失

開啟python編譯器,輸入0.1 0.2,期待的結果是0.3,但是輸出為 0.30000000000000004 有點小尷尬,這是為什麼呢?其實這設計到了計算機的浮點數儲存是以二進位制進行儲存的。說二進位制不太形象,換成我們最長使用的十進位制和分數 1 5,使用小數表示為0.2,但是1 3,使用小...

浮點數精度丟失問題

c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...

浮點數計算中的精度丟失

在記憶體中儲存的浮點數方法格式分別是 float 符號位 1bit 指數 8 bit 尾數 23 bit double 符號位 1bit 指數 11 bit 尾數 52 bit 其中指數也有正負之分,有乙個bit位是符號位。於是,float的指數範圍為 128 127 2 7 128 2 7 1 1...