標籤:
原文網址:http://blog.chinaunix.net/uid-24118190-id-75212.html
單雙精確度浮點數的IEEE標準格式
關鍵字:浮點數 IEEE標準
大多數進階語言按照IEEE-754標準來規定浮點數的儲存格式。
IEEE-754規定 單精確度浮點數用4位元組儲存,雙精確度浮點數用8位元組儲存,表示為三部分:符號位、階和尾數。
S+E+M
S 符號位,尾數的符號位;
E 階,即指數;
M 尾數,即有效小數位元;
單精確度格式
符號位 1位, bit31
階 8位,bit30~23
尾數 24位,bit22~0
雙精確度
符號位 1位,bit63
階 11位,bit62~52
尾數 53位,bit51~0
省略位
位元的規格化表示中,小數點前的數(即二進位表示的最高位)為1,故省略之。
所以 float的M 用23位可以表示24位的值,double的M 用52位可以表示53位的值。
階碼
以移碼的形式儲存。對於float位移量為127(7FH),對於double位移量為1023(3FFH)。
儲存浮點數的階碼之前,位移量要先加到階碼上。原因如下:
float的值的二進位科學計數法表示中 階的範圍 ±127, 當一個數“無限”趨近於0,即為 浮點0.
為了保證 浮點0 與 機器0 的儲存表示一樣,階在儲存時加上位移 127
eg
2^3,移碼的結果 在單精確度中為82H(130=3+127),在雙精確度中為402H(1026=3+1023)。
浮點數有兩個例外
0.0儲存為全零;
無限大數的階碼儲存為全1,尾數部分全零,符號位指示正無窮或者負無窮。
例子:
float 十進位 規格化(S+E+M)
-12 -1.1x23 1 10000010 1000000 00000000 00000000
0.25 1.0x2-2 0 01111101 0000000 00000000 00000000
所有位元組在記憶體中的排列順序
intel的cpu按little endian順序
motorola的cpu按big endian順序排列。
常用的浮點數儲存格式:32-bit IEEE-754 floating-point format
對於大小為32-bit的浮點數(32-bit為單精確度,64-bit浮點數為雙精確度,80-bit為擴充精度浮點數),
1、其第31 bit為符號位,為0則表示正數,反之為複數,其讀數值用s表示;
2、第30~23 bit為冪數,其讀數值用e表示;
3、第22~0 bit共23 bit作為係數,視為二進位純小數,假定該小數的十進位值為x;
十進位轉浮點數的計算方法:則按照規定,十進位的值用浮點數表示為:
如果十進位為正,則s = 0,否則s = 1;將十進位數表示成二進位,然後將小數點向左移動,直到這個數變為1.x的形式即尾數,移動的個數即位指數。為了保證指數為正,將移動的個數都加上127,由於尾數的整數位始終為1,故捨去不做記憶。
對3.141592654來說,
1、正數,s = 0;
2、3.141592654的二進位形式為正數部分計算方法是除以二取整,即得11,小數部分的計算方法是乘以二取其整數,得0.0010 0100 0011 1111 0110 1010 1000,那麼它的位元表示為11.0010 0100 0011 1111 0110 1010 1;
3、將小數點向左移一位,那麼它就變為1.1001 0010 0001 1111 1011 0101 01,所以指數為1+127=128,e = 128 = 1000 0000;
4、舍掉尾數的整數部分1,尾數寫成0.1001 0010 0001 1111 1011 0101 01,x = 921FB6
5、最後它的浮點是表示為0 1000 0000 1001 0010 0001 1111 1011 0101 = 40490FDA
浮點數轉十進位的計算方法:
則按照規定,浮點數的值用十進位表示為:
= (-1)^s * (1 + x) * 2^(e - 127)
對於49E48E68來說,
1、其第31 bit為0,即s = 0
2、第30~23 bit依次為100 1001 1,讀成十進位就是147,即e = 147。
3、第22~0 bit依次為110 0100 1000 1110 0110 1000,也就是二進位的純小數0.110 0100 1000 1110 0110 1000,其十進位形式為(0.110 0100 1000 1110 0110 1000 * 2^23) / (2^23) = (0x49E48E68 & 0x007FFFFF) / (2^23) = (0x648E68) / (2^23) = 0.78559589385986328125,即x = 0.78559589385986328125。
這樣,該浮點數的十進位表示
= (-1)^s * (1 + x) * 2^(e - 127)
= (-1)^0 * (1+ 0.78559589385986328125) * 2^(147-127)
= 1872333
http://discuz.liulc.com/dnt2/showtopic.aspx?topicid=59&page=end
【轉】單雙精確度浮點數的IEEE標準格式