python浮點數陷阱

先放一張圖
python浮點數陷阱
計算機內部對於浮點數處理是不夠精確的。

1、浮點數的二進制表示
整數部分:用十進制整數整除以2,得到商和餘數,該餘數就是二進制數的最低位,然後繼續用商整除以2,得到新的商和餘數,以此類推,直到商等於0,由所有餘數倒排組成了該整數的二進制表現形式。
小數部分:乘以2,取整數0或者1,剩下的小數繼續乘2一直重複,直到小數部分爲0或達到指定的精度爲止

2、存儲規則
由於Python封裝了C語言的特性,根據國際IEEE754標準進行存儲。
IEEE754標準包含一組實數的二進制表示法,由符號位、指數位、尾數位組成,各種精度各部分的位數如下:
python浮點數陷阱

3、轉換爲IEEE754標準的二進制數
規格化
當尾數不爲0時,尾數域的最高有效位爲1,這稱爲浮點數的規格化。否則,以修改階碼同時左右移動小數點位置的辦法,使其成爲規格化數的形式。
32位浮點數:
python浮點數陷阱,S爲符號位(0正1負),M爲規格化後的小數尾數
64位浮點數:e=E-1023

移碼
在真值基礎上加2^n(機器字長爲n+1),其中2^n>x≥-2^n

舉一個簡單例子:
1.5=[1.1],符號位爲0,指數e=0,規格化後尾數爲1.1。

尾數域M右側以0補全,得尾數域:
M=[100 0000 0000 0000 0000 0000]

階碼E:
E=[0]移−1=[10000000]−1=[01111111]

得1.5的機器碼:
1.5=[0011 1111 1100 0000 0000 0000 0000 0000]
十六進制表示爲1.5=0x3fc00000。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章