浮點數

因爲進制的關係,十進制下的大多數小數,在二進制下沒法完美的表示,只能表示爲無限循環小數。ide

好比0.5能夠表示爲0.1,0.4則只能表示爲0.011001100110......編碼

十進制小數轉換成二進制小數的方法,能夠經過對小數部分乘2法來實現,spa

好比:0.43d

0.4   *2    0.8orm

0.8   *2    1.6blog

0.6   *2    1.2ip

0.2   *2    0.4內存

取乘積的整數部分,獲得,0.0110的無限循環。ci

還有一種方法就是把0.4看出2/5即2除以5,即10/101,經過除法運算也能夠獲得相同的值。get

所以計算機有限的內存註定沒法表示無限的循環小數,只能使用近似值代替。32位和64位的表示方法以下:

clipboard

其中階碼的值用移碼錶示,移碼是符號位取反的補碼,[X]移與[X]補的關係是符號位互爲相反數(僅符號位不一樣)。

還須要注意的是,該階碼值須要減去偏移值127後纔是正真的指數值,偏移值一般爲2e-1 - 1,其中的e爲階碼的長度。以單精度浮點數爲例,它的指數域是8個比特,固定偏移值是28-1 - 1 = 128?1 = 127

在表示浮點數的時候,咱們老是確保最高位是1,若是是0的話,則乘以2^n,即左移n位變成1。

所以23位的尾數能夠表示24位有效數字。這種簡化浮點數表示的操做稱之爲規格化。規格化後的數據都是以下格式

±1.xxxxxx*2^E

1.1010001*2^10100 表示成32位時,階碼須要加上127

 0001 0100

+0111 1111

——————

 1001 0011

所以,當浮點數是正數的時候,最小值的編碼以下:

clipboard[1]

階碼爲0-127=127,小數部分爲1,所以該值表示 2^-127

clipboard[2]

階碼爲255-127=128,小數部分爲1.11111111111111111111111(正數部分爲1,小數部分23個1),所以該值表示 (2-2^-23)*2^128

1.11111111111111111111111=2-2^-23,這個等式讓我一開始也愣了下,想了下有多種方式證實。

1.11111111111111111111111=2^0+2^-1+2^-2+2^-3+2^-4………………+2^-22+2^-23

等比數列求和公式    
clipboard[3]

a1=1,q=1/2, n=24

所以最終的結果等於2-2^-23

   

還有一種計算方式

1.11111111111111111111111=10-0.000000000000000000000001

二進制表示即爲2-2^-23

同理,最高位若是改爲1的話,表示負數。所以浮點數的取值範圍爲:

[- (2-2^-23)*2^128,-2^-127] 和 [2^-127, (2-2^-23)*2^128] 換算成十進制則爲  
clipboard[4]

如該數軸的顯示,其餘區域將會致使溢出。實際上,這個浮點數在數軸上並非連續的,只能是一個十分接近的近似值,但這個近似值已足夠知足通常的應用了。

上述浮點數的表示只是一種一般的解釋方式,實際使用中有會有部分改進,好比上述的浮點數無法表示真正的0。

目前使用最普遍的浮點數的表示方法是IEEE 754標準所定義的,該標準定義了32位單精度和64位雙精度。

IEEE754標準定義了一些特殊值。以下圖所示,摘自維基百科

clipboard[5]

逐行解釋:

1.正零和負零,除去符號位,全部的數都爲0的狀況,認爲是±0。這個0是一個精確值。

2.當指數是0111 1111=127時,減去偏移量127,即實際指數爲0,尾數全零,默認的小數點前的數字是1,因此這種狀況認爲是±1.0

3.當指數域爲0,尾數位非0時,認爲是非規格化的數。規格化的數字,默認認爲小數點前是1,而非規格化的數字,默認認爲小數點前的數字是0。

  而且,當數字是非規格化時,規定偏移量比原先大1,變成了-126。

4.指數域不爲0,爲規格化的數字,此時尾數域默認小數點前的數字是1,最小的規格化的數字的實際指數爲1-127=-126,即最小的規格化數字爲±2^-126

5.指數最大不能爲255,255爲保留值,只能是254,所以,實際指數值爲254-127=127。最大的規格化的數字即1.11111111111111111111111(二進制)^127

6.指數域全1,尾數域全0,表示正負無窮。

7.指數域全1,尾數域不爲0,是非法的浮點數。

以上規則,總結以下:

形式 指數 小數部分
0 0
非規約形式 0 非0
規約形式 1-254 任意
無窮 255 0
NaN 255 非零

引入非規約形式的浮點數是頗有必要的有效可使用的,只是它們的絕對值已經小於全部的規約浮點數的絕對值;即全部的非規約浮點數比規約浮點數更接近0。

clipboard[6]

它填補了一部分空隙,使得數字更均勻覆蓋數軸,非規格化數字的使用,稱之爲逐級下溢,若是不採用這種方式,那麼絕對值最小的規約浮點數與0的距離是相鄰的小浮點數之間距離的2^23倍!能夠說是很是忽然的下溢出到0。這種狀況的一種糟糕後果是:兩個不等的小浮點數X與Y相減,結果將是0.

根據以前列出的IEEE754中的一些特殊值,能夠看出,32位浮點數值的取值範圍-3.4 × 10^38 到 +3.4 × 10^38

參考資料

《計算機組成與體系結構》

https://zh.wikipedia.org/wiki/IEEE_754

相關文章
相關標籤/搜索