因爲進制的關係,十進制下的大多數小數,在二進制下沒法完美的表示,只能表示爲無限循環小數。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位的表示方法以下:
其中階碼的值用移碼錶示,移碼是符號位取反的補碼,[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
所以,當浮點數是正數的時候,最小值的編碼以下:
階碼爲0-127=127,小數部分爲1,所以該值表示 2^-127
階碼爲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
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] 換算成十進制則爲
如該數軸的顯示,其餘區域將會致使溢出。實際上,這個浮點數在數軸上並非連續的,只能是一個十分接近的近似值,但這個近似值已足夠知足通常的應用了。
上述浮點數的表示只是一種一般的解釋方式,實際使用中有會有部分改進,好比上述的浮點數無法表示真正的0。
目前使用最普遍的浮點數的表示方法是IEEE 754標準所定義的,該標準定義了32位單精度和64位雙精度。
IEEE754標準定義了一些特殊值。以下圖所示,摘自維基百科
逐行解釋:
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。
它填補了一部分空隙,使得數字更均勻覆蓋數軸,非規格化數字的使用,稱之爲逐級下溢,若是不採用這種方式,那麼絕對值最小的規約浮點數與0的距離是相鄰的小浮點數之間距離的2^23倍!能夠說是很是忽然的下溢出到0。這種狀況的一種糟糕後果是:兩個不等的小浮點數X與Y相減,結果將是0.
根據以前列出的IEEE754中的一些特殊值,能夠看出,32位浮點數值的取值範圍-3.4 × 10^38 到 +3.4 × 10^38
參考資料
《計算機組成與體系結構》