【轉】單雙精確度浮點數的IEEE標準格式

來源:互聯網
上載者:User

標籤:

原文網址: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標準格式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.