由Python浮點數溢位問題到二進位制

2021-08-15 13:32:04 字數 1614 閱讀 5066

為什麼說浮點數缺乏精確性? python中浮點數運算問題 - 知乎

問題描述中很清楚,0.1+0.1+0.1-0.3沒有得到結果0,而是溢位了(python3.6中不會)。數字在計算機中都是用二進位制儲存的,那就應該用二進位制解釋一下。

我們目前使用的數字都是十進位制,方便理解和運算;計算機的底層電路是用與或非電路設計的。它只能識別二進位制,所以計算機中的數字用二進位制來表示。(數字在計算機中以補碼形式儲存,但以下內容用原碼解釋,容易理解)

整數二進位制:01010101

位置數:右邊為低位,末位記為0位;左邊為高位,從右向左依次增加1。

每位的數字只能是0或1,每位代表的大小為該位的數字*2的n次方,n是位置數。若每一位的數字都是1,則從右到左每位表示的大小為1,2,4,8,…,2^n,依次擴大二倍。

二進位制數字代表的大小為:對每一位二進位制代表的大小進行求和舉例:7的二進位制是0111,12的二進位制是1100等

浮點數二進位制:01010101.01010101

浮點數同樣用二進位制儲存。整數部分和整數二進位制相同,小數部分原理相同

小數部分:0位是1能代表1∗2

0=

11*2^0=1

1∗20=1

,小數點後第一位是1則能夠代表1∗2

−1

=0.5

1*2^=0.5

1∗2−1=

0.5,小數點後第二位是1能夠代表1∗2

−2

=0.25

1*2^=0.25

1∗2−2=

0.25

,依次縮小2倍,原理同整數。

【問題1】二進位制轉為十進位制數很簡單,那麼十進位制如何轉為二進位制呢?

# 整數求二進位制

# 1.每次除以2,記下商和餘數(以後用上一次的商除以2)

# 2.直到某次商等於0結束

# 3.把餘數倒序書寫12/

2=6.

..06/

2=3.

..03/

2=1.

..11/

2=0.

..1以12為例,二進位制為1100

# 小數求二進位制

# 1.每次乘以2,記下結果,並把整數和小數部分分離。(以後用上一次的小數部分乘以2)

# 2.直到某次小數部分為0結束

# 3.把整數部分正序書寫

0.625*2

=1+0.25

0.25*2

=0+0.5

0.5*2=

1+0.0以0.625為例,二進位制為0.101

0.4*2=

0+0.80.8*2

=1+0.6

0.6*2=

1+0.20.2*2

=0+0.4

0.4*2=

0+0.8...

以0.4為例,它無法結束,二進位制為0.01100110..

.

【問題2】回到知乎問題,為什麼說浮點數缺乏精確性,結果會溢位?

p.s. 浮點數在計算機中是以科學記數法表示的:a*10^n,a是底數,n是指數。以64位雙精度為例,底數佔52位,指數佔11位,另外還有1位符號位,因此浮點值只有52位的精度,所以會出現捨入錯誤。

浮點數的儲存及輸出問題

main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001 為什麼會是 123.456001 有六位小數可以理解,最後那個 1是為何?有很多人解釋說最後那個 1是亂碼,隨機的。嘿嘿 其實無論你執行它多少次,最後始終都跟著乙個 1。這最...

浮點數精度問題

一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...

python中浮點數運算問題

這是因為小數以二進位制形式表示時的 有窮性導致的。我們知道,將乙個小數轉化為二進位制表示的方式是,不斷的乘2,取其中的整數部分。例如 1 0.625 2 1.25,整數部分為1,小數部分為0.25 2 0.25 2 0.5 整數部分為0,小數部分為0.5 3 0.5 2 1 整數部分為1,小數部分為...