計算機組成原理:定點數的運算

1、定點數的加減運算

(1) 原碼的加減運算

原碼的加減運算規則
先判別兩數符號。對於加法,相同爲加,相異爲減;對於減法,相同爲減,相異爲加;
運算時,比較兩數的絕對值,並以較絕對值減去較絕對值。
符號位不參與運算;符號在數值位運算結束後確定。

缺點:原碼加減法過程在計算機中過於複雜。

(2) 反碼的加法運算

反碼加法最高位進位而丟掉高位時,必須在最低位補上 +1

(3) 補碼的加減運算

補碼的加減運算是目前計算機中普遍採用的加減法實現的運算方式。
補碼加減運算規則

  1. 對於加法,有[X+Y]補 = [X]補 + [Y]補
  2. 對於減法,有[X-Y]補 = [X]補 + [-Y]補
  3. [Y]補的各位(包括符號位)均取反,然後最低位+1,可以得到[-Y]補;當然,也可以直接對-Y求補碼。
  4. 符號位與數值位一起參與運算,運算得到的符號位即爲結果的符號。

(4) 溢出的判別方法

當運算結果超出了機器數的位數所能表示的數值範圍時,稱爲溢出上溢

對應的概念是,浮點數中數值的絕對值小於浮點數能表示的絕對值最小的數時,稱爲下溢。

由於計算機中實現加減運算往往使用補碼,因此這裏只給出補碼加減的溢出判別法:

1) 符號對比法

由於在加減運算中,只有當加法同號時纔會發生溢出。(減法異號由補碼加減規則可以變爲加法同號)
因此,在加法中,若兩加數符號相同,只需比較結果得出的符號是否發生變化,即可得知是否發生溢出。
設加數X的符號位爲fx,Y的符號位爲fy,結果的符號位爲fs。則溢出發生的判斷式爲:f = fx·fy·~fs + ~fx·~fy·fs

2) 進位匹配法

由方法1可以發現,當最高數值位產生進位,而符號位不進位時,必然發生符號改變;若最高數值位不進位,而符號位進位時,也必然發生符號改變。因此,判斷最高數值位符號位進位是否匹配,就可以得知是否發生溢出。
設最高數值位的進位爲Cn,符號位的進位爲Cs,則溢出發生的判斷式爲: f = C ⊕ Cs

3) 雙符號位法

由方法2可以發現,假設符號位前還有一位,當進位不匹配時,會影響符號位和其前一位的數值。由此可以總結出一種新的溢出判別法:用兩位符號位表示正負,其中00爲正11爲負。運算時,兩個符號位均參與運算。若結果的符號位出現01和10的異常情況,說明發生了溢出;否則沒有溢出。其中,10表示發生負溢出01表示發生正溢出
設低符號位爲S1,高符號位爲S2,則溢出發生的判斷式爲:f = S1 ⊕ S2

由於補碼的減法是通過加法實現,因此再轉爲加法運算後,均可用以上方法判斷溢出。

2、定點數的乘法運算

(1) 定點原碼一位乘法

定點原碼一位乘法的運算規則如下:

  1. 初始狀態下,部分積爲全0。
  2. 判斷乘數的最低位。若最低位爲0,部分積不變;最低位爲1,部分積加上被乘數
  3. 部分積和乘數右移,乘數右移丟棄的部分已經完成運算不再需要;部分積右移丟棄的部分存入乘數的左邊,結束時取出。
  4. 重複如上步驟,直到乘數原有的所有位全部被讀完(共重複n次)。
  5. 最後一次右移後,得到的部分積是結果的高位部分,乘數中存儲的是結果的低位部分
  6. 將高位和低位部分拼接,並判斷符號位,可以得到最終結果。

缺點:由於大部分計算機中加減運算均採用補碼運算。因此採取原碼乘法還需要額外的轉換。

(2) 定點補碼一位乘法:校正法

給出定點補碼一位乘法的規則前,先說明補碼的移位:
補碼在符號位爲0時,不變;符號位爲1時,右移需在高位補1。雙符號位下,01右移變爲00,10右移變爲11。

補碼的乘法中,不同的乘數對應有不同的運算規則:
對於Y>0,[X·Y]補 = [X]補 · [Y]補
對於Y<0,[X·Y]補 = [X]補 · [Y]補的數值部分 + [-X]補
這種對於Y<0單獨作修正的方法,稱爲定點補碼一位乘法的校正法

校正法的運算規則如下:

  1. 首先判斷乘數的符號(被乘數的符號無需考慮),確定是否需要校正;
  2. 部分積和被乘數採用兩位符號位,並計算第一步:[x]補 · [Y]補的數值部分,該步驟方法與原碼相似,但符號位參與運算。
  3. 若Y<0,對上面的結果作 +[-X]補 的修正,即可得到最終結果。

缺點:校正法的計算需要判斷是否需要修正,對計算機來說過於複雜。

(3) 定點補碼一位乘法:Booth算法

Booth算法不需要判斷是否校正,實現了補碼一位乘法運算的統一。

Booth算法的運算規則如下:

  1. 部分積和被乘數均採用兩位符號位,乘數採用一位符號位;乘數在最低位另設一位低位,初始爲0;
  2. 判斷乘數的最低兩位情況,對於00和11,部分積不變01時部分積+[X]補10時部分積+[-X]補;之後做一次右移;
  3. 重複步驟2,直到乘數右移至只剩兩位原有的數(應爲一個符號位和一個最高數值位),共重複n次;
  4. 進行最後一次判斷(共做n+1次),處理部分積但不做移位,將得到的部分積與乘數儲存的低位部分拼接,得到最終結果。

3、定點數的除法運算

(1) 定點原碼一位除法:恢復餘數法

在除法過程中,需要用餘數減去除數,可能會出現餘數等於除數,大於除數或小於除數三種情形;等於除數時表示除盡,上商爲1並結束計算;大於除數時,上商爲1,完成減法並移位後重復操作;小於除數時,上商爲0並移位後重復操作。由這個思路可以得到恢復餘數法的運算規則。

恢復餘數法的運算規則如下:

  1. 初始餘數爲被除數,以兩位符號位表示,不參與運算
  2. 對餘數+[-x]補,得到新的餘數;若新餘數爲正,上商爲1;若新餘數爲負,上商爲0,並加上[x]補恢復餘數
  3. 上商步驟完成後,餘數左移一位,得到新餘數;
  4. 重複上面的步驟,直到達到規定的精度或除盡。
  5. 商即爲上商得到的結果;餘數爲最後一次得到的餘數 R * 2-n

缺點:恢復餘數法時,對於餘數小於0的情形需要多做一個加法操作,增加了計算次數;而且餘數的正負性隨着被除數和除數改變而改變,不具有規律性,因此在計算機內需要進行的計算次數不能固定,給電路的設計增加了困難。

(2) 定點原碼一位除法:加減交替法

根據恢復餘數法,可以得到:y>0時,下一次運算的結果爲2R - |Y|;y<0時,下一次運算的結果爲2(R+ |Y|) - |Y| = 2R + Y。
注:左移一次,若左邊丟棄的數是0,就相當於整個數乘以2。
由此,我們可以使用在不同情況下的交替加減的方法來代替恢復餘數法,以此確定計算的次數。這種方法叫做加減交替法。

加減交替法的運算規則如下:

  1. 初始餘數爲被除數,以兩位符號位表示,不參與運算
  2. 若餘數爲正,加上[-Y]補;若餘數爲負,加上[Y]補;由此得到新餘數
  3. 若新餘數爲正,上商爲1並左移;若新餘數爲正,上商爲0並左移
  4. 重複上面的步驟,直到達到規定的精度或除盡;若最後一次的餘數爲負,需要恢復餘數以得到正確的餘數;
  5. 商即爲上商得到的結果;餘數爲最後一次得到的餘數 R * 2-n
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章