如何理解double精度丟失問題?

時間 2021-06-01 02:14:38

1樓:邱昊宇

很簡單,從二進位制角度考慮問題即可:把「0.1」轉成二進位制的表示,然後還原成十進位制,就能看出問題。

一、把 0.1 轉成二進位制表示

我們知道 DEC(1) 就是 BIN(1),但是 DEC(0.1) 怎麼轉換成二進位制?對了!用除法:

0.1 = 1 ÷ 10

很簡單,二進位制就是要算

1 ÷ 1010

我們回到小學的課堂,來列豎式吧:

0.0001100111010 ) 1 00001010110010101000010101100101010

相信上過小學的你一定會發現,除不盡,除出了乙個無限迴圈小數:二進位制的 0.0001100110011...

二、捨入

我們得把 0.0001100110011... 放進乙個 double「雙精度浮點數」裡面雙精度浮點數能表示多少精度呢?檢視文件會發現:

半精度(16bit):11 位有效數字

單精度(32bit):24 位有效數字

雙精度(64bit):53 位有效數字

四精度(128bit):113 位有效數字

好吧,雙精度是 53 位有效數字

0. 10011...

方便起見,我在第 53 個有效數字後面加了個空格。

那麼問題來了:十進位制數我們可以四捨五入,二進位制怎麼辦?精神是一樣的:待處理部分有沒有達到前一位的一半,達到就進製,沒達到就捨去。(暫且當作 0 舍 1 入。)

那麼我們的 0.1 在 double 中就是

0. 10011...

0.而 1.1 就是

1. 10011...

1.三、加法

這個很簡單,1.1 + 0.1 就是

1.+ 01.

因為結果仍然是 double,需要再做一次保留 53 位有效數字和捨入:

1. 1010

1.四、結果

好了,終於可以回到十進位制的世界了,我們把最終結果轉換回來:

1.得到十進位制的:

1.20000000000000018

一般的輸出函式,在輸出浮點數時,都會限制顯示的有效數字,即會再做一次四捨五入。題目中的 1.2000000000000002 是這個結果在顯示時四捨五入後的結果。

1.20000000000000018

1.2000000000000002

---正經答題:1.2000000000000002 的原理上面已經一步步分析了。

至於各個語言之間的差異,答案是可能會有,比如可能因為選擇的捨入規則的不同可能導致的結果的不同;甚至有可能某個語言裡的浮點數壓根不是 IEEE 754 的浮點數,而是以字串方式儲存的,所以可能沒有誤差。

2樓:曲奇

原理是一樣的,都遵循同樣的標準。

根本原因在於,數學意義上的小數不是每個都能用二進位制在有限位數內精確的表示。

像 0.1,1.1 這樣的小數沒有精確的二進位制表示,然後求和就不是1.2了。

intj如何解決自己特別希望別人理解的問題?

ZWEISIEDLER 認清別人的理解沒有必要。且人和人是割裂的,不要去強求理解這種東西,有就有,沒有也沒事。相信你所相信的。這種東西需要用力氣爭取那就走遠了,沒必要。 Cilia 答案就是 人和人之間是不可能相互理解的 要是人人都能理解你,那你得多平庸啊。把時間浪費在解釋自己的行為上不如幹點別的,...

如何理解zun用海螺姑娘解釋阿求的壽命問題?

梅露克里斯 阿求因為御阿扎之子的契約的緣故活不了太久,靈魂在死後會保留記憶轉世,所以我覺得神主讓阿求死掉然後換人是有可能的,前提是他這個設定不是喝醉之後說的DA ZE 蘿蔔 結合問題來看,問阿求最終結局是什麼,這大概和問艦隊啥時候關服差不多 換成其他遊戲也一樣 這一方面涉及到可能壓根還沒考慮的設定問...

如何理解 機器學習不問因果只關問相關性,只作歸納不作演繹 ?

目前的機器學習是學習因果如何關聯的,而不是學習誰因誰果的。目前的機器學習研究的確是側重於歸納學習,即從包含 具體 的訓練集 sample label 中歸納出 體現一般規律的 函式或者是規則 sample label 當我們設定sample為我們認為的因 e.g.小時候是否注射過破傷風疫苗 labe...