詳解 浮點數的規格化表示

《深入理解計算機系統》(蘭德爾 E. 布萊恩特)中對浮點數的描述不容易懂,在這裏記錄一下,以加深理解。

1、IEEE浮點表示

IEEE(讀作“eye-triple-ee”)浮點標準754中,用圖1的形式來表示一個數:

圖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)形式表示的有符號整數" 。也就是說,階碼所表示的實際數值應是 

{\color{Green} E = e - Bias} 

其中 e 位的階碼所表示的無符號數值,其位表示形式爲:" {\color{Green} e_{k-1}e_{k-2}\cdot \cdot \cdot e_{1}e_{0}} "。 

而Bias是一個等於 {\color{Green} 2^{k-1}-1} 的偏置值,例如單精度float的偏置是127。由此產生指數的取值範圍,對於單精度float是 -126~127 (針對階碼數值爲-127或128時的分析,請參考情況2和情況3)

 

而尾數字段,則被定義爲

{\color{Green} M = 1 + f}

其中,位的尾數所表示的小數值,滿足 \small {\color{Green} 0\leq f< 1},其二進制表示爲:" \small {\color{Green} 0.f_{n-1}f_{n-2}\cdot \cdot \cdot f_{1}f_{0}} ",也就是二進制小數點在最高有效位的左邊。

有時,這種方式也叫做隱含的以1開頭的表示 ,因爲我們可以把尾數 看成是一個二進制表達式爲:" \small {\color{Green} 1.f_{n-1}f_{n-2}\cdot \cdot \cdot f_{1}f_{0}} " 的數字。

爲什麼要用這種表示方式,既然我們總能夠調整階碼 E ,使得尾數 M 在範圍 \small {\color{Green} 1\leq M< 2} 之中,那麼這種表示方法是一種輕鬆獲得一個額外精度位的技巧——既然第一位總是等於1,那我們就不需要顯式地表示它。

由此,規格化形式可以表示的數值 的範圍是 \small {\color{Green} \infty > \begin{vmatrix} V \end{vmatrix}> 0} 。

 

情況2:非規格化的值

 當階碼的所有bits全爲0時,所表示的數是非規格化形式。(針對單精度float,階碼值爲-127)

在這種情況下,階碼的數值是 {\color{Green} E = 1 - Bias} 。而尾數的值是 {\color{Green} M = f} ,也就是尾數字段的值,開頭沒有隱含的1。

——那麼,爲什麼非規格化形式爲什麼將階碼值定義爲 \small {\color{Green} 1 - Bias},而不是 \small {\color{Green} -Bias} ?

——因爲只有這樣,才能從非規格化值平滑轉換到規格化值。對此,本文章最後以數字示例做了詳細解釋。

 非規格化形式提供了兩種數值0的表示以單精度float爲例,分別是:

+0:0    0000 0000    000 0000 0000 0000 0000 0000;

-0: 1    0000 0000    000 0000 0000 0000 0000 0000。

由此,非規格化形式可以表示的數值 V 的範圍是分段函數 \small {\color{Green} \left\{\begin{matrix} 1> V\geq +0,& s=0\\ -1< V\leq -0,&\; \; s=1 \end{matrix}\right.} ,其中,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 值,比如計算 \small {\color{Green} \sqrt{-1}} 或 \small {\color{Green} \infty -\infty } 時。

NaN  :x    1111 1111    xxx xxxx xxxx xxxx xxxx xxxx

3、數字示例 

圖2展示了假定的8位浮點格式的示例,其中有 k = 4 的階碼位和 n = 3 的小數位。於是可知偏置量 Bias 是 \small {\color{Green} 2^{4-1}-1=7} 。

圖2 8位浮點格式的非負值示例

可以觀察到,最大非規格化數 {\color{Green} \frac{7}{512}} 和最小規格化數 {\color{Green} \frac{8}{512}} 之間的平滑轉變。這種平滑性歸功於我們對非規格化數的階碼 E 的數值的定義。通過將非規格化數的階碼 E 定義爲 1 - Bias,而不是 -Bias,我們可以補償非規格化數的尾數沒有隱含的1。

本文完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章