1. 程式人生 > >浮點數轉二進位制規則學習記錄

浮點數轉二進位制規則學習記錄

浮點數轉二進位制

浮點數的儲存格式

目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和小數來表示,底數定為2——即把一個浮點數表示為小數乘以2的指數次方再添上符號。float遵從的是IEEE R32.24 ,而double 遵從的是R64.53。具體如下:
float型別:單精度浮點值,1位符號,8位指數,23位小數。
float
double型別:雙精度浮點值,1位符號,11位指數,52位小數。
double

轉換規則

將浮點數的整數部分和小數部分分別轉換為二進位制並按照科學計數法表示,然後按照相應的儲存格式排列。
浮點數精度問題:小數部分在轉換時的實際位數按照相應的精度標準來處理。例如float型別轉換時小數部分轉換後的實際位數為float精度標準(24)減去整數部分轉換的二進位制數所佔的位數。
隱藏位技術:科學計數法的最高位1不寫入記憶體。
階碼:因為指數可以為負,為了便於計算,規定都先加上偏置量Bias=2^(k-1)-1,其中k是指數位數。對於float型別k=8即Bias=127,對於double型別k=11即Bias=1023.
注意:(1)如果只有小數部分,那麼需要右移小數點。(2)十進位制在轉換為二進位制的時候可能會不準確,如2.2,而double型別的資料也存在同樣的問題,所以在浮點數表示中會產生些許的誤差,在單精度轉換為雙精度的時候,也會存在誤差的問題,對於能夠用二進位制表示的十進位制資料,如2.25,這個誤差就會不存在。(3)當階碼為全0且尾數也為全0時,表示的真值為零,結合符號位為0或1,有正零和負零之分。當階碼為全1且尾數為全0時,表示的真值為無窮大,結合符號位為0或1,也有+∞和-∞之分。

Python演算法實現

struct.pack(fmt,v1,v2,...).encode('hex')

引數說明:fmt – 格式字元,f和d對應C中float和double型別。v1,v2… – 需要轉化的數值,浮點數對應Python中float型別。
注意:格式字元fmt中<和>分別對應位元組順序中小端序大端序,最低有效位元組(類似於最低有效位)在最高有效位元組的前面,則稱小端序;反之則稱大端序。