1. 程式人生 > >float與 double型數據存儲---IEEE浮點數表示法

float與 double型數據存儲---IEEE浮點數表示法

0.12 理解 float 標準 顯示 運算 details .com c/c++

目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。

這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
符號位 指數部分 尾數 長度
float 1 8 23 32
double 1 11 52 64

具體換算見http://blog.csdn.net/chen_lady/article/details/51105443

以下通過幾個例子講解浮點數如何轉換為二進制數

例一:

已知:double類型38414.4。

求:其對應的二進制表示。

分析:double類型共計64位,折合8字節。由最高到最低位分別是第63、62、61、……、0位:
最高位63位是符號位,1表示該數為負,0表示該數為正;
62-52位,一共11位是指數位;
51-0位,一共52位是尾數位。

步驟:按照IEEE浮點數表示法,下面先把38414.4轉換為十六進制數。
把整數部和小數部分開處理:整數部直接化十六進制:960E。小數的處理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了。隱藏位技術:最高位的1不寫入內存(最終保留下來的還是52位)。
如果你夠耐心,手工算到53位那麽因該是:38414.4(10)=1001011000001110.0110011001100110011001100110011001100(2)

科學記數法為:1.001011000001110 0110011001100110011001100110011001100,右移了15位,所以指數為15。或者可以如下理解:

1.001011000001110 0110011001100110011001100110011001100×2^15
於是來看階碼,按IEEE標準一共11位,可以表示範圍是-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023(2^10-1),在這裏,階碼:15+1023=1038。二進制表示為:100 00001110;
符號位:因為38414.4為正對應0;
合在一起(註:尾數二進制最高位的1不要):
01000000 11100010 11000001 110 01100 11001100 11001100 11001100 11001100

例題2:將double型數據寫入文件,十六進制顯示變成奇怪的數據,如何判斷是否正確?

技術分享

float與 double型數據存儲---IEEE浮點數表示法