本文講什么?
浮點數和定點數一樣,都是計算機中數據的存儲形式。定點數我們可以理解成純小數或者純整數,但是實際上在計算機中參與運算的數字並非都是定點數。比如,有些數據過大,比如2^100^這樣的數據,如果寫成二進制的形式,寄存器肯定是無法放下的。於是就有了浮點數這種數據。
本文主要講述浮點數的概念、浮點數的規格化,以及浮點數的各種運算。
浮點數
所謂浮點數,就是小數點的位置會改變的數字。什么情況下小數點會發生改變呢?比如下面這樣:
22.101 = 0.22101 * 10^2 = 0.022101 * 10^3(注意,此處的數據都是十進制的)
上面的22.101的小數點的位置之所以會發生變化,究其原因不過是乘以了10的對應次方。根據我們以前學過的內容,10同樣可以換成其他的數字,比如2,相應的冪次也會發生變化。我們稱這個10或者2為基數,基數的冪次為階碼;而小數點不斷變化的數稱作尾數。再看一個數字:
11.0101(2) = 0.110101*2^10 = 0.0110101*2^11(格式:【尾數符號|尾數|階碼符號|階碼】)
注意啊,上面的數字全部都是二進制的,包括基數和階碼。一開始我看這個數字是懵逼的,因為我就是搞不明白為啥0.110101*2^3^ = 0.110101*2^11^,后來才明白,原來11是3的二進制形式,這塊千萬要看好,我就被坑了。
浮點數在計算機中的表現形式:和上面我給出的格式略有不同,因為上面的那種形式是我用來給大家解釋說明的。而下面這種格式才是真正存儲在計算機中的格式。
浮點數的表示范圍:就像我們之前說過的定點數,同樣有其表示的范圍,浮點數也是一樣,同樣有表示范圍,如果一個數字超過了這個表示范圍,則稱為溢出。表示范圍如下圖:
浮點數有上溢區和下溢區之分,當浮點數的階碼大於最大階碼時,稱為上溢,此時機器停止運算,進行溢出中斷處理;如果階碼小於最小的階碼時,稱為下溢, 此時溢出的數值非常小,直接強制將浮點數的尾數置為0,可以繼續執行運算。
浮點數的規格化:其實浮點數的規格化沒什么好說的,基本上是和我們當年學的科學計數法是一個樣子的。我們就說一下基數為2的規格化方式:基數為2時,尾數最高為1的數規格化數。規格化時,尾數左移一位,階碼減1;尾數右移一位,階碼加1。當尾數小於等於1的時候,規格化就完成了。
我們來看看如何將一個數規格化成浮點數(包括其原碼、反碼、補碼):
- 例子:設浮點數字長為16位,其中階碼5位,尾數11位,令x=-54,請將其規格化為基數為2的浮點數
1)先將-54轉換為二進制形式:-110110
2)規格化得到-(0.1101100000)* 2^110^
3)得到在浮點機中的結果:[x]~原~ = 0.0110;1.1101100000,[x]~補~=0.0110;1.0010100000,[x]~反~=0.0110;1.0010011111.
浮點數的運算
從上面的介紹中能夠知道,在計算機中,浮點數都能夠表示成* 尾數(乘)基數 ^階碼^*的這種形式,這就給浮點數的四則運算帶來了巨大的便利。
浮點數的加減法運算
浮點數的加法非常簡單,只需要記住下面的這幾個步驟就能夠准確的運算:
1)對階,使得兩數的小數點位置對齊。
2)尾數求和,將對階后的兩個尾數按照定點的加減法運算規則計算。
3)規格化,為增加有效數字的位數,提高運算精度,必須將求和(差)后的尾數規格化
4)舍入,為提高精度,要考慮尾數右移時候丟失的數值位
5)溢出判斷,判斷計算結果是否存在溢出
因為浮點數的加法比較簡單,我們就不給出具體的例子了,我只是強調幾點。
- 所謂的對階,就是對階碼進行運算。我們讓兩個階碼做減法,判斷哪個階碼更大,誰大就向誰看齊。同時,兩個階碼差幾就讓對應的尾數向左或者向右移動幾位,使得階碼之間的差值為0.
- 尾數求和就是兩個尾數相加,這個沒什么好說的,按照定點的運算就可以了。
- 尾數計算完畢后,需要規格化。
因為在上面我們講了浮點數的表示范圍,當基數為2的時候,規格化數s的絕對值應該屬於[1/2,1)之間,所以當s<0的時候,補碼規格化形式為00.1xxxxx,而s>0的時候,補碼規格化形式為11.0xxxx。 所以,尾數的最高數值位和符號位不同的時候,就存在兩種可能的情況。
這就導致當規格化數小於0的時候,規格化有兩種方式。
浮點數的乘除法運算
浮點數的乘除法運算其實也是基於加減運算的。
運算步驟如下:
1)階碼相加減:按照定點整數的加減法運算方法對兩個浮點數的階碼進行加減運算。
2)尾數相乘或相除:按照定點小數的陣列乘除法運算方法對兩個浮點數的尾數進行乘除運算。為了保證尾數相除時商的正確性,必須保證被除數尾數的絕對值一定小於除數尾數的絕對值。若被除數尾數的絕對值大於除數尾數的絕對值,需對被除數進行調整,即被除數的尾數每右移1位,階碼加1,直到被除數尾數的絕對值小於除數尾數的絕對值。
3)結果規格化並進行舍入處理:浮點數乘除運算結果的規格化和舍入處理與浮點數加減運算結果的規格化和舍入處理方法相同。並且在浮點數乘除運算的結果中,由於乘積和商的絕對值一定小於1,因此在浮點乘除運算結果進行規格化處理時只存在向左規格化,不可能出現向右規格化。
4)判斷溢出:浮點數乘除運算結果的尾數不可能發生溢出,而浮點數運算結果的溢出則根據運算結果中浮點數的階碼來確定,溢出的判定和處理方法與浮點加減運算完全相同。
例子像下面這樣:
- 例子:設兩浮點數x=2-001×(-0.100010),y=2-100×(0.010110),求x*y
[x]~浮~=11111,1.011110 [y]~浮~=11100,0.010110
1)階碼相加 [Ex+Ey]補=[Ex]補+[Ey]補=11111+11100=11011 2)尾數作直接補碼陣列乘法運算 [Mx]補×[My]補=1.110100010100 3)結果規格化並進行舍入處理 積的尾數左移2位,階碼減2,采用“0舍1入”法進行舍入處理后,得 [x×y]浮=11001,1.010001 4)判斷溢出 乘積的階碼的雙符號位相同,故乘積無溢出。 所以x×y=2-111×(-0.101111)
結束語
至此,計算機運算方法這一章節就算是完成了,大家如果有問題可以私信、留言。
如果你喜歡我的文章,歡迎關注我的微信公眾號:最高權限比特流
參考:
《計算機組成原理》唐朔飛
博客:https://blog.csdn.net/xingqingly/article/details/18981671