本文摘自:http://blog.csdn.net/chen_lady/article/details/51105443
IEEE制定的浮點數表示規則;
了解:
目前C/C++編譯器標准都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64
以下通過幾個例子講解浮點數如何轉換為二進制數
例一:
已知:double類型38414.4。
求:其對應的二進制表示。
分析:
double類型共計64位
最高位(第63位)是符號位,1表示該數為負,0表示該數為正;
62-52位,一共11位是指數位;
51-0位,一共52位是尾數位。
步驟:
按照IEEE浮點數表示法,下面先把38414.4轉換為十六進制數。把整數部和小數部分開處理:
整數部直接化十六進制:960E 即: 1001011000001110
小數的處理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
實際上這永遠算不完!這就是著名的浮點數精度問題。
手工算到53位那么是:38414.4(10) = 1001011000001110.0110011001100110011001100110011001100(2)
科學記數法為:1.001011000001110 0110011001100110011001100110011001100,左移了15位,指數為15。
階碼:
按IEEE標准一共11位,可以表示范圍是-1024 ~ 1023。為了便於計算,iEEE規定都先加上1023(2^10-1),
階碼:15+1023=1038。二進制表示為:100 00001110;
符號位:
因為38414.4為正,對應為0;
結果:(尾數二進制最高位的1不要):
|-- 尾數 --|
符號位 階碼 |--尾數中的整數部分 -| |-- 尾數中的小數部分 --|
0 1000000 1110 0010 11000001 110 01100 11001100 11001100 11001100 11001100
例二:
已知:整數3490593(16進制表示為0x354321)。
求:其對應的浮點數3490593.0的二進制表示。
解法如下:
先求出整數3490593的二進制表示:
1.1010101000011001000012×221
階碼:
同上例,階碼值 = 實際指數值 + 127 ,那么本例子的階碼值為: 148 = 127 + 21 ;
將148轉為二進制表示為10010100
結果:(尾數二進制最高位的1不要):
符號位 階碼 尾數
0 10010100 101010100001100100001