浮點數的表示方法

爲了在計算機裏面表示浮點數,人們定義了一些標準,來描述浮點數

本文的浮點數介紹基於IEEE 754標準,這個標準廣泛運用於許多CPU和浮點處理器上

IEEE的浮點標準爲:V = (-1)^s * M * 2^E

  • s爲符號位,下圖s
  • M爲尾數位,及下圖的frac
  • E爲階碼,爲下圖的exp
(圖1)單精度和雙精度浮點數

圖1顯示的分別是單精度(float) 和雙精度(double)表示形式。

 

一個IEEE標準的浮點數是由【規格化數】+【非規格化數】+【特殊的數】組成,下文將分別對這三個組成部分一一介紹:

 

【規格化數】

【定義】:當exp不全爲0,也不全爲1時則爲規格化數

人們爲了更廣的定義浮點數,對規格化數中的exp進行了細分,在規格化數中最大的exp爲2^{^{k}}-2,最小的exp則爲1,所以人們在最大最小的兩個數中間找到了一箇中間值Bias: 2^{k-1}-1,所以大於這個Bias的exp爲正指數,小於這個Bias的exp爲負指數,所以在規格化數中E = e-Bias ,單精度中這個Bias爲127。

看了浮點數的表現形式,就有疑惑了,這個小數點打在哪裏?

標準是這樣定義【規格數】小數點的:

  1. 對於二進制浮點數,小數點左側必須只有一位且必須爲1
  2. 爲了節省空間,小數點的左側的1須省去(實際計算的時候由硬件電路加上)

所以抽象點想,小數點其實就打在了exp和frac的中間,但對於規格化數的運算時,M=1+frac。

那麼單精度的浮點數計算公式:V = (-1)^s * (1 + frac) * 2^{exp-127}

 

【非規格化數】

【定義】:當exp爲全0時,所表示的數就是非規格化數

非規格數主要解決的問題是浮點數表示0的問題,其次是解決那些近視於0的數:

  1. 對於二進制浮點數,當exp全爲0的時候,小數點左側必須只有一位且必須爲0

所以計算非規格化數的時候,M=0+frac。

不光是這點不同,

非規格數E(指數)的表示方法也不一樣,雖然exp爲0但是E=1-Bias,爲什麼這個是1不是0呢??這個其實主要爲了保證數據的平滑過渡。

在規格化數中最小的數表達形式是V=(1 + frac)*2^{1-127}取值範圍爲[2^{-126} , 2^{-125}),而如果非規格數e取0則表達形式爲V = frac*2^{-127}取值範圍爲[0,2^{-127}),所以規格化數和非規格化數中間會產生一個空隙,如果e取1的時候則非規格化數的取值範圍爲[0,2^{-126}),這樣就可以平滑的過渡過去

 

【特殊的數】

最後人們又定義了一些特殊的數:

  1. 當階碼全爲1,且尾數位全爲0,則該數表示爲無窮,s(符號位)爲1表示正無窮,爲0表示負無窮。
  2. 當階碼全爲1,且尾數位不全爲0,這表示NaN,該數表示爲“Not a Number”(不是一個數),這個東西很有用,當一些運算的結果不能用實數或無窮來表示的時候,就可以用該數表示,例如:\sqrt{-1}

 

 

 

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