根據IEEE 754標準,浮點數的表示形式如下:
S為數的符號位
? ? 第一個域:為符號域。其中0 表示數值為正數,而 1 則表示負數。
P為階碼,通常用移碼表示
? ? 第二個域為指數域,對應于我們之前介紹的二進制科學計數法中的指數部分。
? ? 指數閾:通常使用移碼表示:
? ?(移碼和補碼只有符號位相反,其余都一樣。對于正數而言,原碼、反碼和補碼都一樣;對于負數而言,補碼就是其絕對值的原碼全部取反,然后加1(不包括符號位))。
? ? ?其中單精度數為 8 位,雙精度數為 11 位。以單精度數為例,8 位的指數為可以表達 0 到 255 之間的 255 個指數值。
? ? ?但是,指數可以為正數,也可以為負數。
? ? ?為了處理負指數的情況,實際的指數值按要求需要加上一個偏差(Bias)值作為保存在指數域中的值,單精度數的偏差值為 127(0-111 1111)(8位),而雙精度數的偏差值為 1023(0-1 1111 1111)(10位)。
? ? ? 比如,單精度的實際指數值 0在指數域中將保存為 127;而保存在指數域中的 64 則表示實際的指數值 -63。偏差的引入使得對于單精度數,實際可以表達的指數值的范圍就變成 -127 到 128 之間(包含兩端)[-127, 128]。
M為尾數,用原碼表示。
? ? ? 圖例中的第三個域為尾數域,其中單精度數為 23 位長,雙精度數為 52 位長。
? ? ? 除了我們將要講到的某些特殊值外,IEEE 標準要求浮點數必須是規范的。
? ? ? 這意味著尾數的小數點左側必須為 1,因此我們在保存尾數的時候,可以省略小數點前面這個 1,從而騰出一個二進制位來保存更多的尾數。這樣我們實際上用 23 位長的尾數域表達了 24 位的尾數。
?? ? ? ?比如對于單精度數而言,二進制的 1001.101(對應于十進制的 9.625)可以表達為 1.001101 × 23,所以實際保存在尾數域中的值為 00110100000000000000000,即去掉小數點左側的 1,并用 0 在右側補齊。
目前,計算機中主要使用三種形式的IEEE 754浮點數,如下表所示
舉例
下面舉例說明27.0f在二進制文件中怎么表示。
float共計32位,折合4字節
由最高到最低位分別是第31、30、29、……、0位
31位是符號位,1表示該數為負,0反之。
30-23位,一共8位是指數位。
22-0位,一共23位是尾數位。
每8位分為一組,分成4組,分別是A組、B組、C組、D組。
每一組是一個字節,在內存中逆序存儲,即:DCBA
27.0表示成二進制為:11011.0
用科學計數法表示為1.110110*2^4,現在我們要的尾數和指數都出來了。
尾數為:1101 10?(刪除前面的第一個1,因為用科學計數法表示,二進制中第一個永遠都為1,計算機在存儲的時候就沒有存儲這個1,只存儲小數點后面的位數)?? 不足23位,補0,就是1011 0000 0000 0000 0000 000(23位)
指數:為4 。一共8位,可以表示范圍是0 ~ 255的無符號整數,也可以表示-128~127的有符號整數。但因為指數是可以為負的,所以為了統一把十進制的整數化為二進制時,都先加上127。
所以:4+127=131? 變成二進制就是10000011
27.0用二進制表示就是:
加上第31位的符號位0
就是0100 0001 1101 1000 0000 0000 0000 0000
十六進制就是:41 D8 00 00
再看一個數27.5,二進制為11011.1
1.10111*2^4
尾數(小數點后的數)10111,補夠23位 1011 1000 0000 0000 0000 000
指數:4,加上127,就是131,二進制1000 0011
用二進制表示就是 (符號數位1位)0 (指數位8位)1000 0011 (尾數位23位)1011 1000 0000 0000 0000 000
寫成二進制標準形式:0100 0001 1101 1100 0000 0000 0000 0000
寫成16進制就是41 DC 00 00