1. 程式人生 > >挑戰408——組成原理(6)——浮點數及其加減運算

挑戰408——組成原理(6)——浮點數及其加減運算

相對於定點數,浮點數就是小數點可以浮動的數。通常用來表示數值範圍相差很大的數(比如太陽的質量跟電子的質量相差)。 通常我們使用這樣的表示式來表示浮點數: 在這裡插入圖片描述 其中,r表示底(因為是指數的形式,一般取2的n次方),E表示階碼(階碼可正可負)。M為位數(可正可負)。 當r = 10的時候,就是我們熟悉的科學計數法。在計算機中我們研究的是r = 2的時候。

規格化數與浮點數的規格化

為了提高資料的精確度以及便於比較浮點數的大小,在計算機中規定浮點數的尾數用純小數表示。其中尾數最高位為1的浮點數稱為規格化數。比如 N = 0.110101 X 2^10.尾數的最高位為1.所以稱為規格化數。 為了提高浮點數的精確度,要求其尾數必須為規格化數,如果不是規格化數,那麼就要修改階碼的值並同時左右移尾數的方法,使其變為規格化數。 根據尾數的移動位置,我們將規格化分為左規和右規

(待會詳細說)。我們先來看看一個十進位制數的移動: 在這裡插入圖片描述 二進位制的移動也是如此的。 因此我們得到這樣的結論: 在這裡插入圖片描述 從圖中我們可以看出至少這幾點:

  1. 對於原碼而言,其規格化數的最高位一定是1
  2. 對於補碼而言,其規格化數的最高位一定與符號位相反
  3. 對於正數,無論其是原碼還是補碼,規格化後的形式一樣
  4. 對於負數,補碼的規格化數是原碼規格化數的除了規格化位以外的全部取反

IEEE754標準

現代計算機的浮點數一般採用IEEE定製的國際標準,這種標準形式如下: 在這裡插入圖片描述 根據浮點數的位數的不同,常見的浮點數有三種,短浮點數(float),長浮點數(double),臨時浮點數。具體形式如下:

在這裡插入圖片描述 考試中,最常出現的當屬短浮點數了,因為長浮點數位數較多且原理與短浮點數一致。

  1. 最高位為符號位,佔用一位的空間
  2. 階碼為8位,以移碼的方式儲存,階碼錶示的範圍為[1 ~ (2^8) - 1],為什麼不是0-255?因為全0用來表示無窮大,全0表示非規格化數
  3. 尾數數值位為23位,在這裡採用了隱藏位策略,由於我們規定了尾數最高位為1,也就是說數值位的第一位總會是1,所以我們可以採用23位來表示24位的數(我們把最高位的數值位隱藏了起來)。即不在23位數值位中儲存這個1(這部分內容經常!!
  4. 偏置值,對於float數而言,偏置值為127((2^7) - 1,其中,全一表示無窮大,至於為什麼是7次方不是8次方,回顧移碼的定義),表示階碼的移動。在儲存浮點數階碼之前,要將偏置值加到階碼的真值上。比如階碼為3,那麼移碼錶示的階碼
    為: 127 + 3 = 130(80H)。

所以,規格化後,float數的真值為: 在這裡插入圖片描述 其中 s = 0代表正數,s = 1 代表負數。由我們剛剛討論出來的各個欄位的範圍可以得到float浮點數的表示範圍顯然,當E = 1,M= 0 的時候,浮點數最小, 當 E = 254, M = 111111…(23個1).的時候,浮點數最大在這裡插入圖片描述

浮點數的加減運算

同定點數相同,浮點數的加減也採用補碼的形式運算,不同的是,浮點數運算的過程較為麻煩。

  1. 對階 即小數點的位置對齊,此時兩個浮點數的階碼相等。因此我們首先得得出兩個浮點數相差幾階。由小階轉向大階,具體操作是將數值部分右移一位, 此時階碼 +1。(這裡面隱含著捨棄掉有效位的風險)
  2. 尾數求和 對階後就好辦了,對階完相當於小數點位置確定,直接進行定點數的加減。
  3. 規格化 規格化,浮點數的規格化通常採用雙符號位,前面我們已經說過雙符號位這個概念了。 在這裡插入圖片描述
  4. 舍入 在對階和右規的過程中,尾數的低位有效位位很可能移丟(因為是小轉大),這時候就會影響精度產生誤差(注意,產生誤差≠結果錯誤)。這樣的溢位我們稱為尾數溢位。因此必須對尾數進行舍入。常用的方法有: 恆置“1”法:無論右移捨去的是誰,都在末尾新增1 舍“0”入“1”法:右移過程中,尾數是0則捨去,是1,則尾數末尾加1.(存在尾數再次溢位的風險)
  5. 溢位判斷 判斷浮點數的溢位,我們採用雙符號法,但是與定點數有一點不同:當尾數之和出現01.XXXXXX或者10.XXXXXX的時候,並不能直接下結論溢位,應當再右規一次,才能判斷是否真的溢位,且規後發現其階碼的符號位出現01或者10的時候,說明溢位

浮點數的加減運算(例項)

下面是一道2009年的408的考試真題: 在這裡插入圖片描述 我們先看看,首先第一步沒得說,先寫出X和Y的二進位制表示,注意含有兩個符號位: 在這裡插入圖片描述 在這裡插入圖片描述 然後按步驟做題: 在這裡插入圖片描述 這一步我們發現這個時候X和Y的階碼已經相同(00,111)了。 在這裡插入圖片描述 在這裡插入圖片描述