爲了在計算機裏面表示浮點數,人們定義了一些標準,來描述浮點數
本文的浮點數介紹基於IEEE 754標準,這個標準廣泛運用於許多CPU和浮點處理器上
IEEE的浮點標準爲::
- s爲符號位,下圖s
- M爲尾數位,及下圖的frac
- E爲階碼,爲下圖的exp
圖1顯示的分別是單精度(float) 和雙精度(double)表示形式。
一個IEEE標準的浮點數是由【規格化數】+【非規格化數】+【特殊的數】組成,下文將分別對這三個組成部分一一介紹:
【規格化數】
【定義】:當exp不全爲0,也不全爲1時則爲規格化數
人們爲了更廣的定義浮點數,對規格化數中的exp進行了細分,在規格化數中最大的exp爲,最小的exp則爲1,所以人們在最大最小的兩個數中間找到了一箇中間值Bias: ,所以大於這個Bias的exp爲正指數,小於這個Bias的exp爲負指數,所以在規格化數中 ,單精度中這個Bias爲127。
看了浮點數的表現形式,就有疑惑了,這個小數點打在哪裏?
標準是這樣定義【規格數】小數點的:
- 對於二進制浮點數,小數點左側必須只有一位且必須爲1
- 爲了節省空間,小數點的左側的1須省去(實際計算的時候由硬件電路加上)
所以抽象點想,小數點其實就打在了exp和frac的中間,但對於規格化數的運算時,M=1+frac。
那麼單精度的浮點數計算公式:
【非規格化數】
【定義】:當exp爲全0時,所表示的數就是非規格化數
非規格數主要解決的問題是浮點數表示0的問題,其次是解決那些近視於0的數:
- 對於二進制浮點數,當exp全爲0的時候,小數點左側必須只有一位且必須爲0
所以計算非規格化數的時候,M=0+frac。
不光是這點不同,
非規格數E(指數)的表示方法也不一樣,雖然exp爲0但是,爲什麼這個是1不是0呢??這個其實主要爲了保證數據的平滑過渡。
在規格化數中最小的數表達形式是取值範圍爲,而如果非規格數e取0則表達形式爲取值範圍爲,所以規格化數和非規格化數中間會產生一個空隙,如果e取1的時候則非規格化數的取值範圍爲,這樣就可以平滑的過渡過去
【特殊的數】
最後人們又定義了一些特殊的數:
- 當階碼全爲1,且尾數位全爲0,則該數表示爲無窮,s(符號位)爲1表示正無窮,爲0表示負無窮。
- 當階碼全爲1,且尾數位不全爲0,這表示NaN,該數表示爲“Not a Number”(不是一個數),這個東西很有用,當一些運算的結果不能用實數或無窮來表示的時候,就可以用該數表示,例如: