目前c/c++編譯器標準都遵照ieee制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和小數來表示,底數定為2——即把乙個浮點數表示為小數乘以2的指數次方再添上符號。float遵從的是ieee r32.24 ,而double 遵從的是r64.53。具體如下:
float型別:單精度浮點值,1位符號,8位指數,23位小數。
double型別:雙精度浮點值,1位符號,11位指數,52位小數。
將浮點數的整數部分和小數部分分別轉換為二進位制並按照科學計數法表示,然後按照相應的儲存格式排列。
浮點數精度問題:小數部分在轉換時的實際位數按照相應的精度標準來處理。例如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,也有+∞和-∞之分。
struct.pack(fmt,v1,v2,..
.).encode(
'hex'
)
引數說明:fmt – 格式字元,f和d對應c中float和double型別。v1,v2… – 需要轉化的數值,浮點數對應python中float型別。
注意:格式字元fmt中《和》分別對應位元組順序中小端序和大端序,最低有效位元組(類似於最低有效位)在最高有效位元組的前面,則稱小端序;反之則稱大端序。
浮點數的二進位制
1.前幾天,我在讀一本c語言教材,有一道例題 include void main void 在我的編譯器下 編譯是會發生錯誤的。錯誤 cannot convert from int to float win7 vc6.0 sp6 執行結果如下 num的值為 9 pfloat的值為 0.000000 ...
浮點數二進位制表達
浮點數二進位制表達的三個組成部分 step 1 改寫整數部分 以數值5.2為例。先不考慮指數部分,我們先單純的將十進位制數改寫成二進位制。整數部分很簡單,5.即101.step 2 改寫小數部分 小數部分我們相當於拆成是2 1一直到2 n的和。例如 0.2 0.125 0.0625 0.007825...
浮點數轉化二進位制
乙個int型別表示的整數值是 2 31 2 31 1 32位二進位制表示 1111111111111111 11111111 11111111 011111111 11111111 11111111 1111111 類似整數聯想到浮點數是怎麼表示的呢?最初正常人可能為這樣想的 但是這樣好像表示的數也...