浮點數和定點數同樣,都是計算機中數據的存儲形式。定點數咱們能夠理解成純小數或者純整數,可是實際上在計算機中參與運算的數字並不是都是定點數。好比,有些數據過大,好比2^100^這樣的數據,若是寫成二進制的形式,寄存器確定是沒法放下的。因而就有了浮點數這種數據。
本文主要講述浮點數的概念、浮點數的規格化,以及浮點數的各類運算。微信
所謂浮點數,就是小數點的位置會改變的數字。什麼狀況下小數點會發生改變呢?好比下面這樣:spa
22.101 = 0.22101 * 10^2 = 0.022101 * 10^3(注意,此處的數據都是十進制的)
上面的22.101的小數點的位置之因此會發生變化,究其緣由不過是乘以了10的對應次方。根據咱們之前學過的內容,10一樣能夠換成其餘的數字,好比2,相應的冪次也會發生變化。咱們稱這個10或者2爲基數,基數的冪次爲階碼;而小數點不斷變化的數稱做尾數。再看一個數字:.net
11.0101(2) = 0.110101*2^10 = 0.0110101*2^11(格式:【尾數符號|尾數|階碼符號|階碼】)
注意啊,上面的數字所有都是二進制的,包括基數和階碼。一開始我看這個數字是懵逼的,由於我就是搞不明白爲啥0.110101*2^3^ = 0.110101*2^11^,後來才明白,原來11是3的二進制形式,這塊千萬要看好,我就被坑了。code
浮點數在計算機中的表現形式:和上面我給出的格式略有不一樣,由於上面的那種形式是我用來給你們解釋說明的。而下面這種格式纔是真正存儲在計算機中的格式。
xml
浮點數的表示範圍:就像咱們以前說過的定點數,一樣有其表示的範圍,浮點數也是同樣,一樣有表示範圍,若是一個數字超過了這個表示範圍,則稱爲溢出。表示範圍以下圖:
blog
浮點數有上溢區和下溢區之分,當浮點數的階碼大於最大階碼時,稱爲上溢,此時機器中止運算,進行溢出中斷處理;若是階碼小於最小的階碼時,稱爲下溢, 此時溢出的數值很是小,直接強制將浮點數的尾數置爲0,能夠繼續執行運算。get
浮點數的規格化:其實浮點數的規格化沒什麼好說的,基本上是和咱們當年學的科學計數法是一個樣子的。咱們就說一下基數爲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.博客
從上面的介紹中可以知道,在計算機中,浮點數都可以表示成* 尾數(乘)基數 ^階碼^*的這種形式,這就給浮點數的四則運算帶來了巨大的便利。string
浮點數的加法很是簡單,只須要記住下面的這幾個步驟就可以準確的運算:it
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)
至此,計算機運算方法這一章節就算是完成了,你們若是有問題能夠私信、留言。
若是你喜歡個人文章,歡迎關注個人微信公衆號:最高權限比特流
參考:
《計算機組成原理》唐朔飛
博客:http://www.javashuo.com/article/p-gejevfuh-cq.html