《深入理解計算機系統》(蘭德爾 E. 布萊恩特)中對浮點數的描述不容易懂,在這裏記錄一下,以加深理解。
1、IEEE浮點表示
IEEE(讀作“eye-triple-ee”)浮點標準754中,用圖1的形式來表示一個數:
符號(sign)——s決定這個數是負數(s=1)還是正數(s=0),而對於數值0的符號位解釋,作爲特殊情況處理;
尾數(significand)——M決定浮點數的精度,它是一個二進制小數;
階碼(exponent)——E的作用是對浮點數加權,這個權重是2的E次冪(可能是負數),它決定浮點數的取值範圍。
對於雙精度double,組成形式是:1位符號,11位階碼,52位尾數。
對於單精度float,組成形式是:1位符號,8位階碼,23位尾數。
2、浮點數值的分類
根據階碼,浮點數可以分成三種情況:規格化的,非規格化的或特殊值
情況1:規格化的值
當階碼的所有bits,既不全爲0,也不全爲1時,都屬於這種情況。
此時,階碼字段被解釋爲"以偏置(Bias)形式表示的有符號整數" 。也就是說,階碼所表示的實際數值應是
其中 e 是k 位的階碼所表示的無符號數值,其位表示形式爲:" "。
而Bias是一個等於 的偏置值,例如單精度float的偏置是127。由此產生指數的取值範圍,對於單精度float是 -126~127 (針對階碼數值爲-127或128時的分析,請參考情況2和情況3)。
而尾數字段,則被定義爲
其中,f 是n 位的尾數所表示的小數值,滿足 ,其二進制表示爲:" ",也就是二進制小數點在最高有效位的左邊。
有時,這種方式也叫做隱含的以1開頭的表示 ,因爲我們可以把尾數 M 看成是一個二進制表達式爲:" " 的數字。
爲什麼要用這種表示方式,既然我們總能夠調整階碼 E ,使得尾數 M 在範圍 之中,那麼這種表示方法是一種輕鬆獲得一個額外精度位的技巧——既然第一位總是等於1,那我們就不需要顯式地表示它。
由此,規格化形式可以表示的數值 V 的範圍是 。
情況2:非規格化的值
當階碼的所有bits全爲0時,所表示的數是非規格化形式。(針對單精度float,階碼值爲-127)
在這種情況下,階碼的數值是 。而尾數的值是 ,也就是尾數字段的值,開頭沒有隱含的1。
——那麼,爲什麼非規格化形式爲什麼將階碼值定義爲 ,而不是 ?
——因爲只有這樣,才能從非規格化值平滑轉換到規格化值。對此,本文章最後以數字示例做了詳細解釋。
非規格化形式提供了兩種數值0的表示,以單精度float爲例,分別是:
+0:0 0000 0000 000 0000 0000 0000 0000 0000;
-0: 1 0000 0000 000 0000 0000 0000 0000 0000。
由此,非規格化形式可以表示的數值 V 的範圍是分段函數 ,其中,s 爲符號位。
情況3:特殊值
當階碼的所有bits全爲1時,所表示的數是特殊值。(針對單精度float,階碼值爲128)
(1)無窮 ∞
尾數爲0時,該值表示無窮。當兩個非常大的數相乘時,或除數爲0時,無窮能夠表示溢出的結果。
+∞ :0 1111 1111 000 0000 0000 0000 0000 0000
-∞ :1 1111 1111 000 0000 0000 0000 0000 0000
(2)NaN
尾數不爲0時,結果值被稱爲“NaN (Not a Number)”,一些運算的結果不爲實數或無窮時,就會返回這樣的 NaN 值,比如計算 或 時。
NaN :x 1111 1111 xxx xxxx xxxx xxxx xxxx xxxx
3、數字示例
圖2展示了假定的8位浮點格式的示例,其中有 k = 4 的階碼位和 n = 3 的小數位。於是可知偏置量 Bias 是 。
可以觀察到,最大非規格化數 和最小規格化數 之間的平滑轉變。這種平滑性歸功於我們對非規格化數的階碼 E 的數值的定義。通過將非規格化數的階碼 E 定義爲 1 - Bias,而不是 -Bias,我們可以補償非規格化數的尾數沒有隱含的1。
本文完。