為什麼說浮點數缺乏精確性? 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,小數部分為...