計算機組成原理之浮點數
一、浮點數的表示方法:
在計算機中,一個任意進位制數N可以可以寫成:N=R^e*M
一般來說,變化的數值是M和e。在計算機中只需要存M和e即可,R預設為2。為了使浮點數的表示具有唯一性,需要在運算過程中對浮點數進行規格化操作。於是,制定了IEEE754浮點數表示方法。
IEEE754標準浮點數的表示方法:
剛剛提到,在計算機中一個任意進位制數都可以表示為N=R^e*M
的形式,其中e為指數。在IEEE754浮點數表示形式中,階碼為E。這二者有什麼聯絡和區別呢?
首先,我們應該瞭解什麼是階碼。階碼,也叫做移碼。移碼就是把-128~+127之間的數字,都平移到0~255範圍內
移碼對兩個指數大小的比較和對階操作(下面進行浮點數的加減的時候會用到)都比較方便。階碼大的指數的值也就大。對階就是將指數統一,方便進行算數運算。所以,如果給出指數e(真值),那麼它在計算機中就是e+127(1023)這樣存放的。如果給出儲存形式E求真值,那就E-127(1023)。
IEEE754標準中,一個規格化的32位浮點數X的真值可以表示為:X=(-1)^s*(1 . M)*2^(E-127)。其中有個預設的1在整數部分,在計算機中是沒有儲存的,凡是IEEE754規格化浮點數都是預設整數部分為1,也叫隱含的1
特別地,階碼全0和階碼全1用作了兩個特殊用途。
- 當階碼全0,尾數也全部為0(8個0)的時候,表示X為0,再結合符號位S,有+0和-0之分。
- 當階碼全1,尾數全0(8個1,255)的時候表示無窮,同樣也有+∞和-∞之分。
所以,階碼E能表示的有效範圍為1~254。因此,指數e能表示的範圍為E-127,也就是-126~+127。
二、浮點數的加減運算:
四個步驟:
- 0運算元的檢查
這一個步驟非常簡單,就是判斷兩個運算元是否為0,當其中一個運算元為0的時候,沒有必要進行後續的操作了,可以直接得出結果。
- 比較階碼並且完成對階(重點)
如果兩個運算元都不為0
否則,必須先讓二者的階碼相同才能繼續尾數的的運算。兩種選擇:大的階碼→小的階碼,尾數左移或者小數點右移,小的階碼→大的階碼,尾數右移或者小數點左移。
不過,尾數右移會引起最低有效位的丟失,也就是說,丟掉的是最低位,誤差小,左移丟掉的是最高位,誤差大。所以,一般選擇尾數右移,也就是小的階碼化大的階碼(小的階碼增加)。
讓兩個運算元的階碼相同的過程就叫做對階。
- 尾數進行加或減運算
當兩個運算元的階碼相同的時候,我們就可以進行尾數的求和運算了。
- 結果規格化
因為尾數是一個小數,超過1就溢位了,所以尾數一定小於1。
由於為了節約儲存空間,所以一定要讓尾數大於等於0.5,0.5在二進位制中的表示為0.1b,所以小數的最高位為1。為什麼必須為1呢?
舉個簡單的例子(二進位制表示),0.1*2^0,這個數也可以表示為0.000001*2^5,但是這樣表示佔據的儲存位置比較大,而且1越是往後面移動,指數也要增加,這樣一來,指數的儲存空間也要增大。所以,對於浮點數尾數的範圍為0.5<=| M |<1(十進位制)。
因此,結果規格化有一個原則:0.5<=| M |<1。
尾數運算採用雙符號位,浮點運算中,尾數求和結果的絕對值大於1(即溢位符號位為01或者10),稱為向左破壞了規格化。
此時,將尾數運算結果右移用來實現規格化表示,稱為向右規格化,簡稱右規。
如果運算結果的絕對值小於1/2,向右破壞規格化,將尾數結果左移實現規格化表示,稱為向左規格化,簡稱左規。
左規的情況:
- 尾數用原碼錶示,【S】原=Sf . S1S2…Sn,Sf為符號位。如果尾數未發生溢位,但是S1=0,則向右破壞規格化,需要左規。
- 尾數用補碼錶示,【S】補=Sf . S1S2…Sn,Sf為符號位。如果尾數未發生溢位,但Sf⊕S1=0,即Sf和S1相同,則向右破壞規格化,需要左規。
比如,,符號位為1,最高數值位為0,化為真值就是11,是規格化的結果,符號位為1,最高數值位為0,化為真值就是11,是規格化結果。
補碼化真值的方法就是除符號位按位取反在最低位加一(就和原碼化補碼的方法一樣)。如果實在不清楚原補反碼可以在我之前寫的定點數的原補反碼中檢視。
總而言之,尾數用原碼來表示,最高數值位為1的時候是規格化的,對於補碼而言,符號位與最高數值位相異的時候是規格化的。
- 舍入處理
在對階或者或者向右規格化時,尾數要向右移位,這樣,被右移的尾數的低位部分會被丟掉,從而造成一定的誤差,所以要進行舍入的處理。
在十進位制中,我們採用的是“四捨五入”,同樣,在二進位制中,我們是採用“0舍1入”。也就是說,尾數右移的時候,被丟掉的數的最高位是0就捨去,如果是1就將留下的尾數的末位加1。(還有另外一種方法是“恆置一”法,就是不管移掉的數最高位是0還是1,都在保留的尾數的末位加1)
三、浮點數的溢位
A-----最大正數
a-----最小正數
B-----最小負數
b-----最大負數
在機器中,負下溢和正下溢不作處理,因為接近0,直接當作0來處理。
浮點數中,階碼溢位才是真正的溢位,而尾數溢位可以通過左移或者右移加上改變階碼的值來達到尾數不溢位的結果。