1. 程式人生 > >漫談計算機組成原理(九·續)定點數的運算方法

漫談計算機組成原理(九·續)定點數的運算方法

本文講什麼?

在上一篇文章中,我們主要講述了定點數的加、減、乘運算,唯獨沒有講解除法運算。原因有兩個,一來上一篇文章的內容確實比較多,二來除法運算比乘法相對複雜。
所以,本文將從除法的來歷講起,然後講除法運算的幾種方法。

除法運算的形成

我們來看這樣一個例子:在8位暫存器中儲存了00000111,4位暫存器中儲存了0010,計算00000111/0010。
回想一下,我們整數的除法是怎麼做的?如上面的數改寫成十進位制,即7/2的結果是多少呢?
我們肯定是先列出一個除法式子,像下面這樣。

我們首先是判斷一下,當前被除數7中有幾個除數,有幾個則商就上幾個,然後被除數減去除數乘商得到餘數,接著判斷餘數中有幾個除數,直到除不開為止。如果發現商是0,則被除數補0,除數向右移動一位,繼續計算。
在7中有3個2,結果是餘1,1中不存在2,這就是最終的結果。
接著看一下上面的例子:我們要做的,肯定是先列出一個式子。

和整數除法一樣,兩個二進位制數之間的除法同樣的。步驟如下:

  • 要判斷被除數中有幾個除數
  • 有幾個則商上幾,有n個除數商就是n(二進位制除法中,結果不是1就是0)
  • 被除數-n*除數 = 被除數’
  • 除數向右移動一位
  • 繼續上述過程,得到最終結果

大體上的過程就是這樣的。根據上述的過程,我們能夠很容易的設計出基本的除法器。此外,要注意的是,除法器應該具有判斷除數或者被除數是否為0的功能,因為被除數為0時結果為0,沒有意義;而除數為0時,結果為無窮大,無法表示。

計算機定點數除法運算的幾種方法

在瞭解了除法器的基本情況後,我們就來講除法運算的兩種方法。分別是:恢復餘數法、加減交替法。

恢復餘數法

從名字中可以看出,這種方法對餘數做了某種恢復。為什麼會出現這種恢復呢?原因很簡單,我們在分析一般除法的過程中可以看到,如果除數和被除數當前對齊的位上,被除數有0個除數,此時我們就需要將被除數補0。但是計算機並不知道被除數是否夠除除數(因為不管除數和被除數的情況如何,最後的商上的位,不是0就是1),就需要先用被除數減去除數,如果發現餘數是小於0的,那麼計算機就知道了此時對齊的位無法得到最終的結果,則將被除數向又移動一位。

這就是恢復餘數法的核心思想。當然,我們在直接計算的時候,需要將兩個數的絕對值相除,再得到最終的結果。
接下來我們就來看,恢復餘數法究竟是如何運算的。

  • 例子:x=-0.1011,y=-0.1101,求[x/y]
    因為需要使用兩個數的絕對值運算,所以我們先得到兩個數的絕對值。
    [x]=1.1011,[x*]=0.1011;[y]=1.1101,[y*]=0.1101。
    還有,在運算時,因為涉及到兩個數的減法,所以我們需要得到[-y*]
    [-y*]=1.0011.計算過程如下表。


    初始化的時候,被除數放到被除數的位置,而商為0.先減去除數,如果餘數為正,則商上1,否則上0,接著將被除數加上除數。無論哪種情況,都需要將被除數向左移動一位。
    這就是恢復餘數法的過程。最終,別忘了使用異或操作得到符號位,才能得到最終結果。

加減交替法

加減交替法也稱作不恢復餘數法。為啥呢,因為在加減交替法中,先讓被除數減除數,如果結果為正,則上1,;如果結果為負,則加上除數。接著將被除數向做移動一位。不過你要是細看的話,這兩種方法其實並沒有太大的區別,自己好好體會一下就行了。
下面看個例子:

  • 例子:x=0.1011,y=0.1101,求[x/y]
    [x]=1.1011,x*=0.1011;[y]=0.1101,y*=0.1101,[-y*] = 1.0011。
    計算過程如下:

結語

本節是承接定點數的計算方法的,下一節,我們將開始計算機的運算方法後半部分的內容,即浮點數的計算過程,內容並不多,所以會放到一篇文章中。
如果你喜歡我的文章,歡迎關注我的微信公眾號:最高許可權位元流

參考:《計算機組成原理》唐朔飛