ieee制定的浮點數格式
鑑於有人問到在c語言中float和double型態的儲存格式的問題,所以我就在這邊獻醜一翻,講講我所了解的部份,如有任何錯誤,請各位大哥多多指教...
ieee制定之浮點數格式說明:
float型態:用4個bytes儲存,也就是32 bits.
各個bit的用途如下:
bit 31 23~30 0~22
┌───┬────┬───────┐
│正負號│ 指數 │ 底數 │
└───┴────┴───────┘
double型態:用8個bytes儲存,也就是64 bits.
各個bit的用途如下:
bit 63 52~62 0~51
┌───┬────┬───────┐
│正負號│ 指數 │ 底數 │
└───┴────┴───────┘
《說明》正負號(sign): 1為負, 0為正.
指數(exponential):將底數乘上2的指數次方後就是原來的數.
須注意的是: float時,因有8 bits,所以能表示的有2的
256次方,但因為指數應可正可負,所以ieee規定,此處算
出的次方須減去127才是真的指數,所以float的指數可從
-126到128.
同理, double型態有11 bits,算出的值須減去1023,所以
double的指數可從-1022到1024.
底數(mantissa):此部份格式實在難以用文字說明,
請參考下面的例子.
《特例》 0因為無法用任何2的次方表示,所以0的表示法就是
float : 00 00 00 00
double: 00 00 00 00 00 00 00 00
《範例》將17.625換算成float型態.
首先,先將17.625換算成2進製: 10001.101
(什麼??你問我小數是怎麼換的??好吧,就告訴你好了,因為
0.625 = 0.5 + 0.125 , 0.5即1/2 , 0.125即1/8 ,所以
0.625換算成2進製是0.101 ,如果你還沒懂,請你再問別
人.當然,這裡的數字是為了講解方便才用這麼完美的小數,
實際的小數部份,是用無限逼近出來的.)
再來將10001.101向右shift直到小數點前只剩一位(這一位
數當然是1),變成了1.0001101 x 2的4次方(因為向右移了
4位).此時,我們要的底數和指數就出來了:底數部份,因為小
數點前必為1,所以ieee規定只記錄小數點後的就好,所以此
題的底數為0001101 .指數部份實際為4,但在格式中須加上
127 ,固為131 ,即二進位的10000011.
綜合上列各項, 17.625的float儲存格式就是:
0 10000011 00011010000000000000000
轉換成byte : 41 8d 00 00
另外,因為intel cpu是little endian的,所以
41 8d 00 00在記憶體中是按00 00 8d 41的順序放的. (位址
由低到高)
以上的資料,都可以在borland c++的ide環境下,用watch的功能觀察證
明出來.
IEEE 浮點數標準
現在計算機中,浮點數一般採用 ieee 制定的國際標準,這種標準形式如下 數符s 階碼 含階符 尾數 小數點位置 按 ieee 標準,常用的浮點數有三種 符號位s 階碼 尾數 總位數 短實數 單精度 1 8 23 32 長實數 雙精度 1 11 52 64 臨時實數 擴充套件精度 1 15 64 8...
IEEE的浮點數表示
ieee浮點標準用v 1 s m 2 e 由符號,尾數,階碼表示 32位單精度 單精度二進位制小數,使用32位儲存。1 8 23 位長 s exp fraction 31 30 23 22 0 位編號 從右邊開始為0 偏正值 127 64位雙精度 雙精度 二進位制小數,使用64位儲存。1 11 52...
浮點數表示(IEEE 754標準浮點格式)
浮點數的一般表示形式為 乙個十進位制數 可以寫成 n 10e m 乙個二進位制數 可以寫成 n 2e m其中,m稱為浮點數的尾數,是乙個純小數 e是比例因子的指數,稱為浮點數的指數,是乙個整數。在計算機中表示乙個浮點數時,一是要給出尾數m,用小數形式表示 二是要給出指數e,用整數形式表示,常稱為階碼...