计算机组成原理14-定点数的乘法与除法运算

目录

一、乘法运算

1、分析笔算乘法

2、笔算乘法的改进

3、原码一位乘法

4、原码两位乘法

5、补码一位乘法

6、补码两位乘

二、除法运算

1.分析笔算除法

2、原码除法

(1)恢复余数法

(2)加减交替法

(3)原码加减交替法所需的硬件配置

(4)原码加减交替除法控制流程

3、补码除法

(1)补码加减交替法运算规则

(2)补码加减交替法所需的硬件配置

(3)补码加减交替法的控制流程


一、乘法运算

在计算机中,乘法运算是一种很重要的运算,有的机器由硬件乘法器直接完成乘法运算,有的机器内没有乘法器,但可以按机器作乘法运算的方法,用软件编程实现。因此,学习乘法运算方法不仅有助于乘法器的设计,也有助于乘法编程。

下面从分析笔算乘法入手,介绍机器中用到的几种乘法运算方法。

1、分析笔算乘法

设A=0.1101,B=0.1011,求A×B。

笔算乘法时乘积的符号由两数符号心算而得:正正得正;其数值部分的运算如下:

所以  A×B=+0.10001111

可见,这里包含着被乘数4的多次左移,以及四个位积的相加运算。

若计算机完全模仿笔算乘法步骤,将会有两大困难:

  • 其一,将四个位积一次相加,机器难以实现;
  • 其二,乘积位数增长了一倍,这将造成器材的浪费和运算时间的增加。

为此,对笔算乘法做些改进。

2、笔算乘法的改进

将A•B =  A•0.1011

   = 0.1A+0.001•A+0.0001•A

   = 0.1A+0.00•A+0.001(A+0.1A)

   = 0.1A+0.01[0•A+0.1(A+0.1A)]

   = 0.1{A+0.1[0•A+0.1(A+0.1A)]}

   = 2^-1{A+2^-1 [0•A+2^-1 (A+2^-1A)]}

   = 2^-1{A+2^-1 [0•A+2^-1 (A+2^-1(A+0))]}

由上式可见,两数相乘的过程,可视作加法和移位(乘2^-1相当于做一位右移)两种运算,这对计算机来说是非常容易实现的。

从初始值为0开始,对上式作分步运算,则:

  • 第一步:被乘数加零                 A+0=0.1101+0.0000=0.1101
  • 第二步:右移一位,得新的部分积   2^-1 (A+0)=0.01101
  • 第三步:被乘数加部分积                       A+2^-1(A+0)=0.1101+0.01101=1.00111
  • 第四步:右移一位,得新的部分积         2^-1 A+2^-1 (A+0)=0.100111
  • 第五步:0•A +2^-1 [A+2^-1 (A+0)] =0.100111
  • 第六步:2^-1{0•A+2^-1 [A+2^-1 (A+0)]}=0.0100111
  • 第七步:A+2^-1{0•A+2^-1 [A+2^-1 (A+0)]}=1.0001111
  • 第八步:2^-1 {A+2^-1[0•A+2^-1 (A+2^-1 (A+0))]}=0.10001111

上述运算过程可归纳为:

乘法运算可用移位和加法来实现,当两个四位数相乘,总共需做四次加法和四次移位。

②由乘数的末位值确定被乘数是否与原部分积相加,然后右移一位,形成新的部分积;同时,乘数也右移一位,由次低位作新的末位,空出最高位放部分积的最低位。

③每次做加法时,被乘数仅仅与原部分积的高位相加,其低位被移至乘数所空出的高位位置。

计算机很容易实现这种运算规则。用一个寄存器存放被乘数,一个寄存器存放乘积的高位,又用一个寄存器存放乘数及乘积的低位,再配上加法器及其他相应电路,就可组成乘法器。又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。

3、原码一位乘法

由于原码表示与真值极为相似,只差一个符号,而乘积的符号又可通过两数符号的逻辑异或求得,因此,上述讨论的结果可以直接用于原码一位乘,只需加上符号位处理即可。

上图是一个32位乘法器的结构框图,其中32位被乘数放在R2中,运算开始时32位乘数放在R1中,运算结束时64位乘积的高位放在R0中,低位放在R1中,R0和R1串联移位。

完成这个定点原码一位乘法的运算规则可以用如下图所示的逻辑流程图表示。

在该乘法过程中,每次操作是根据乘数的一位进行操作,对于32位数的乘法,需要循环32次完成一个乘法操作,因此称为一位乘法。

例:用原码的乘法方法进行2×3的四位乘法。

解:在乘法开始之前,R0和R1中的初始值为0000和0011,R2中的值为0010。

在乘法的第一个循环中,判断R1的最低位为1,所以进入步骤1a,将R0的值加上R2的值,结果0010送人R0,然后进入第二步,将R0和R1右移一位,R0、Rl的结果为0001 0001,见下表的循环1,表中黑体字的数据位是乘法过程中判断的R1最低位。

第二个循环过程中,判断R1的最低位为1,仍进入步骤la,加0010,结果为0011,然后在第二步中将R0和R1右移一位,结果为0001 1000,见下表的循环2。

第三次循环中,因R1的最低位为0,进入步骤lb,R0不变,第二步移位后结果为00001100,见下表的循环3。

第四次循环时,仍因R1最低位为0,只作移位,结果为00000110,这就是乘法的结果6,见下表的循环4。

4、原码两位乘法

原码两位乘与原码一位乘一样,符号位的运算和数值部分是分开进行的,但原码两位乘是用两位乘数的状态来决定新的部分积如何形成,因此可提高运算速度

两位乘数共有4种状态,对应这4种状态可得下表。

表中倍被乘数可通过将被乘数左移一位实现,而3倍被乘数的获得可以分两步来完成,利用3=4-1,第一步先完成减1倍被乘数的操作,第二步完成加4倍被乘数的操作。而加4倍被乘数的操作实际上是由比“11”高的两位乘数代替完成的,可以看作是在高两位乘数上加“1”。这个“1”可暂时存在Cj触发器中。机器完成置“1” Cj即意味着对高两位乘数加1,也即要求高两位乘数代替本两位乘数“11”来完成加4倍被乘数的操作。

虽然两位乘法可提高乘法速度,但它仍基于重复相加和移位的思想,而且随着乘数位数的增加,重复次数增多,仍然影响乘法速度的进一步提高。采用并行阵列乘法器可大大提高乘法速度。

原码乘法实现比较容易,但由于机器都采用补码作加减运算,倘若做乘法前再将补码转换成原码,相乘之后又要将负积的原码变为补码形式,这样增添了许多操作步骤,反而使运算复杂。为此,有不少机器直接用补码相乘,机器里配置实现补码乘法的乘法器,避免了码制的转换,提高了机器效率。

5、补码一位乘法

一种比较好的带符号数乘法的方法是布斯(Booth)算法。它采用相加和相减的操作计算补码数据的乘积。

Booth算法对乘数从低位开始判断,根据两个数据位的情况决定进行加法、减法还是仅仅移位操作

判断的两个数据位为当前位及其右边的位(初始时需要增加一个辅助位0),移位操作是向右移动。

比如:

  • 第一次判断被乘数0110中的最低位0以及右边的位(辅助位0),得00;所以只进行移位操作;
  • 第二次判断0110中的低两位,得10,所以作减法操作并移位,这个减法操作相当于减去2a的值;
  • 第三次判断被乘数的中间两位,得11,于是只作移位操作;
  • 第四次判断0110中的最高两位,得01,于是作加法操作和移位,这个加法相当于加上8a的值,因为a的值已经左移了三次。

一般而言,设y=y0,y1y2…yn为被乘数,x为乘数,yi是a中的第i位(当前位)。根据yj与yi+1的值,Booth算法表示如下表所示,其操作流程如下图所示。在Booth算法中,操作的方式取决于表达式(yi+1-yi)的值,这个表达式的值所代表的操作为:

  • 0    无操作
  • +1    加x
  • -1    减x

Booth算法操作表示

实现32位Booth乘法算法的流程图

乘法过程中,被乘数相对于乘积的左移操作可表示为乘以2,每次循环中的运算可表示为对于x(y(i+1)-yi)2^(31-i)项的加法运算(i=31,30,…,1,0)。这样,Booth算法所计算的结果  可表示为:

例:用Booth算法计算2×(-3)。

解:[2]补=0010,  [-3]补=1101,在乘法开始之前,R0和R1中的初始值为0000和1101,R2中的值为0010。

在乘法的第一个循环中,判断R1的最低位和辅助位为10,所以进入步骤1c,将R0的值减去R2的值,结果1110送人R0,然后进人第二步,将R0和Rl右移一位,R0和R1的结果为11110110,辅助位为1。

在第二个循环中,首先判断Rl的最低位和辅助位为01,所以进入步骤1b,作加法,R0+R2=1111+0010,结果0001送入R0,这时R0R1的内容为0001 0110,在第二步右移后变为0000 1011,辅助位为0。

在第三次循环中,判断位为10,进入步骤lc,R0减去R2,结果1110送入R0,R1不变;步骤2移位后R0和R1的内容为1111 01011,辅助位为1。

第四次循环时,因两个判断位为11,所以不作加减运算,向右移位后的结果为1111 1010,这就是运算结果(-6)。

这个乘法的过程描述如下表所示,表中乘积一栏表示的是R0、R1的内容以及一个辅助位P,黑体字表示对两个判断位的判断。

用Booth补码一位乘法计算2 ×(-3)的过程

6、补码两位乘

补码两位乘运算规则是根据补码一位乘的规则,把比较yiy(i+1)的状态应执行的操作和比较y(i-1)yi 的状态应执行的操作合并成一步,便可得出补码两位乘的运算方法。

补码两位乘法运算规则如下

由上表可见,操作中出现加2[x]补和加2[-x]补,故除右移两位的操作外,还有被乘数左移一位的操作;而加2[x]补和加2[-x]补,都可能因溢出而侵占双符号位,故部分积和被乘数采用三位符号位。

例:[x]补=0.0101,[y]补=1.0101 求: [x• y]补。

解:求解过程如下表所示。其中乘数取两位符号位即11.0101,[-x]补=1.1011取三符号位为111.1011。

故[x• y]补=1.11001001

可见,与补码一位乘相比,补码两位乘的部分积多取一位符号位(共3位),乘数也多取一位符号位(共2位),这是由于乘数每次右移2位,且用3位判断,故采用双符号位更便于硬件实现。可见,当乘数数值位为偶数时,乘数取2位符号位,共需作n/2次移位,最多作n/2+1次加法,最后一步不移位;当n为奇数时,可补0变为偶数位,以简化逻辑操作。也可对乘数取1位符号位,此时共作n/2+1次加法和n/2+1次移位(最后一步移一位)。

对于整数补码乘法,其过程与小数乘法完全相同。为了区别于小数乘法,在书写上可将符号位和数值位中间的“.”改为“,”即可。

https://wenku.baidu.com/view/22b2b63231126edb6f1a10bf.html

二、除法运算

1.分析笔算除法

以小数为例,设 x=-0.1011,y=0.1101,求x/y

笔算除法时,商的符号心算而得:负正得负;其数值部分的运算如下面竖式。

所以商x/y=0.1101,余数=-0.00000111

其特点可归纳如下:

每次上商都是由心算来比较余数(被除数)和除数的大小,确定商为1还是0。

每做一次减法,总是保持余数不动,低位补0,再减去右移后的除数。

商符单独处理。如果将上述规则完全照搬到计算机内,实现起来有一定困难,主要问题是:

  a.机器不能“心算”上商,必须通过比较被除数(或余数)和除数绝对值的大小来确定商值,即|x|-|y|,若差为正(够减)上商1,差为负(不够减)上商0。

  b.按照每次减法总是保持余数不动低位补0,再减去右移后的除数这一规则,则要求加法器的位数必须为除数的两倍。仔细分析发现,右移除数可以用左移余数的办法代替,其运算结果是一样的,但对线路结构更有利。不过此刻所得到的余数不是真正的余数,只有将它乘上2^-n才是真正的余数。

  c.笔算求商时是从高位向低位逐位求的,而要求机器把每位商直接写到寄存器的不同位也是不可取的。计算机可将每一位商直接写到寄存器的最低位,并把原来的部分商左移一位。

综上所述便可得原码除法运算规则。

2、原码除法

原码除法和原码乘法一样,符号位是单独处理的。以小数为例:

式中为x的绝对值,记作x*

为y的绝对值,记作y*

即商符由两数符号位“异或”运算求得,商值由两数绝对值相除(x*/y*)求得。

小数定点除法对被除数和除数有一定的约束,即必须满足下列条件:

   0<|被除数| ≤ |除数|

实现除法运算时,还应避免除数为0或被除数为0。前者结果为无限大,不能用机器的有限位数表示;后者结果总是0,这个除法操作等于白做,浪费了机器时间。至于商的位数一般与操作数的位数相同。

原码除法中由于对余数的处理不同,又可分为恢复余数法和不恢复余数法(加减交替法)两种。

(1)恢复余数法

恢复余数法的特点是:当余数为负时,需加上除数,将其恢复成原来的余数。

由上所述,商值的确定是通过比较被除数和除数的绝对值大小,即x*-y*实现的, 而计算机内只设加法器, 故需将x*-y*操作变为[x*]补+[-y*]补的操作。

例:已知:x=-0.1011,y=-0.1101,求:[x÷y]原

解:由x*=0.1011,[x]原=1.1011

y*=0.1101,[-y]补=1.0011,[y]原=1.1101

商值的求解过程如下:

故商值为0.1101

商的符号位为

由此可见,共上商5次,第一次上的商在商的整数位上,这对小数除法而言,可用它作溢出判断。即当该位为“1”时,表示此除法为溢出,不能进行,应由程序进行处理;当该位为“0”时,说明除法合法,可以进行。

在恢复余数法中,每当余数为负时,都需恢复余数,这变延长了机器除法的时间,操作也很不规则,对线路结构不利。加减交替法可克服这些缺点。

(2)加减交替法

加减交替法又称不恢复余数法,可以认为它是恢复余数法的一种改进算法。

分析原码恢复余数法得知:

  • 当余数Ri>0时,可上商“1”,再对Ri左移一位后减除数,即2Ri-y*。
  • 当余数Ri>0时,可上商“0”,然后再做Ri+y*,即完成恢复余数的运算,再做2(Ri+y*)-y*,也即2Ri+y*。

可见,原码恢复余数法可归纳为:

  • 当余数Ri>0时,商上“1”,做2Ri-y*的运算;
  • 当余数Ri<0时,商上“0”,做2Ri+y*的运算。

这里已看不出余数的恢复问题了,而只是做加y*或减y*,因此,一般把它叫做加减交替法或不恢复余数法。

例:已知:x=-0.1011,y=-0.1101,求:[x÷ y]原

解:[x]原=1.1011, x*=0.1011

[y]原=0.1101,y*=0.1101,[-y*]补=1.0011

商值的求解过程如下表所示:

商的符号位为

所以

分析此例可见,n位小数的除法共上商n+1次,第一次商用来判断是否溢出。

倘若比例因子选择恰当,除数结果不溢出,则第一次商肯定是0。如果省去这位商,只需上商n次即可,此时除法运算一开始应将被除数左移一位减去除数,然后再根据余数上商。

(3)原码加减交替法所需的硬件配置

下图是实现原码加减交替除法运算的基本硬件配置框图

图中A、X、Q均为n+1位寄存器,其中A存放被除数的原码,X存放除数的原码。

移位和加控制逻辑受Q的末位Qn控制。(Qn=1作减法,Qn=0作加法),计数器C用于控制逐位相除的次数n,GD为除法标记,V为溢出标记,S为商符。

(4)原码加减交替除法控制流程

下图为原码加减交替除法控制流程图

除法开始前,Q寄存器被清0,准备接收商,被除数的原码放在A中,除数的原码放在X中,计数器C中存放除数的位数n。

除法开始后,首先通过异或运算求出商符,并存于S。

接着将被除数和除数变为绝对值,然后开始用第一次上商判断是否溢出。

若溢出,则置溢出标记V为1,停止运算,进行中断处理,重新选择比例因子:若无溢出,则先上商,接着A、Q同时左移一位,然后再根据上一次商值的状态,决定是加还是减除数,这样重复n次后,再上最后一次商(共上商n+1次),即得运算结果。

对于整数除法,要求满足以下条件:

  0 < |除数| ≤ |被除数|

因为这样才能得到整数商。通常在做整数除法前,先要对这个条件进行判断,若不满足上述条件,机器发出出错信号,程序要重新设定比例因子。

上述讨论的小数除法完全适用于整数除法,只是整数除法的被除数位数可以是除数的两倍,且要求被除数的高M位要比除数(n位)小,否则即为溢出。

如果被除数和除数的位数都是单字长,则要在被除数前面加上一个字的0,从而扩展成双倍字长再进行运算。

3、补码除法

与补码乘法类似,也可以用补码完成除法操作。补码除法也分恢复余数法和加减交替法,后者用得较多,在此只讨论加减交替法。

(1)补码加减交替法运算规则

补码除法其符号位和数值部分是一起参加运算的,因此在算法上不像原码除法那样直观,主要需解决三个问题:

  • 第一,如何确定商值
  • 第二,如何形成商符
  • 第三,如何获得新的余数

① 商值的确定

欲确定商值,必须先比较被除数和除数的大小,然后才能求得商值。

a. 比较被除数(余数)和除数的大小

补码除法的操作数均为补码,其符号又是任意的,因此要比较被除数[x]补和除数[y]补的大小就不能简单地用[x]补减去[y]补。实质上比较[x]补和[y]补的大小就是比较它们所对应的绝对值的大小。同样在求商的过程中,比较余数[Ri]补与除数[y]补的大小,也是比较它们所对应的绝对值。这种比较的算法可归纳为以下两点:

  • 第一,当被除数与除数同号时,做减法,若得到的余数与除数同号,表示“够减”,否则表示“不够减”。
  • 第二,当被除数与除数异号时,做加法,若得到的余数与除数异号,表示“够减”,否则表示“不够减”。

此算法如下表所示

b.商值的确定

补码除法的商也是用补码表示的,如果我们约定商的末位用“恒置1”的舍入规则,那么除末位商外,其余各位的商值对正商和负商而言,上商规则是不同的。因为在负商的情况下,除末位商以外,其余任何一位的商与真值都正好相反。因此,上商的算法可归纳为以下两点:

  • 第一,如果[x]补与[y]补同号,商为正,则“够减”时上商“1”。“不够减”时上商“0”(按原码规则上商)。
  • 第二,如果[x]补与[y]补异号,商为负,则“够减”时上商“0”,“不够减”时上商“1”(按反码规则上商)。

结合比较规则与上商规则,使可得商值的确定办法,如下表所示

进一步简化,商值可直接由下表确定

② 商符的形成

在补码除法中,商符是在求商的过程中自动形成的。

在小数定点除法中,被除数的绝对值必须小于除数的绝对值,否则商大于1而溢出。

因此,当[x]补与[y]补同号时,[x]补-[y]补所得的余数[R0]补与[y]补异号,商上“0”,恰好与商的符号(正)一致;当[x]补与[y]补异号时,[x]补+[y]补所得的余数[R0]补与[y]补同号,商上“1”,这也与商的符号(负)一致。

可见,商符是在求商值过程中自动形成的。

此外,商的符号还可用来判断商是否溢出。

例如,当[x]补与[y]补同号时,若[R0]补与[y]补同号,上商“l”,即溢出。当[x]补与[y]补异号时,若[R0]补与[y]补异号,上商“0”,即溢出。

当然,对于小数补码运算,商等于“-1”应该是允许的,但这需要特殊处理,为简化问题,这里不予考虑。

③ 新余数[R(i+1)]补的获得

新余数[R(i+1)]补的获得方法与原码加减交替法极相似,其算法规则为:

  • 当[R0]补与[y]补同号时,商上“1”,新余数 [R(i+1)]补 = 2[Ri]补 - [y]补 = 2[Ri]补 + [-y]补
  • 当[R0]补与[y]补异号时,商上“0”,新余数 [R(i+1)]补 = 2[Ri]补 + [y]补

将此法列于下表:

如果对商的精度没有特殊要求,一般可采用“末位恒置1”法,这种方法操作简单,易于实现,而且最大误差仅为2^(-n)。

例:已知:x=-0.1001, y=+0.1101 求: [x÷y]补

解:[x]补=1.0111,[y]补=0.1101,[-y]补=1.0011

运算过程如下:

所以[x÷y]补 = 1.0101

(2)补码加减交替法所需的硬件配置

补码加减交替法所需的硬件配置基本上与原码加减交替法所需的硬件配置相似。

(3)补码加减交替法的控制流程

除法开始前,Q寄存器被清0,准备接收商,被除数的补码在A中,除数的补码在x中,计数器C中存放除数的位数M。

除法开始后,首先根据两操作数的符号确定是作加法还是减法,加(或减)操作后,即上第一次商(商符),然后A、Q同时左移一位,再根据商值的状态决定加或减除数,这样重复”次后,再上一次末位商“1”(恒置“1”法),即得运算结果。

补充说明几点:

  1. 图中未画出补码除法溢出判断的内容;
  2. 按流程图所示,多作一次加(或减)法,其实末位恒置“1”前,只需移位不必作加(或减)法;
  3. 与原码除一样,图中均未指出对0进行检测,实际上在除法运算前,先检测被除数和除数是否为0,若被除数为0,结果即为0;若除数为0,结果为无穷大,这两种情况都无需继续作除法运算;
  4. 为了节省时间,上商和移位操作可以同时进行。

猜你喜欢

转载自blog.csdn.net/swadian2008/article/details/111559411
今日推荐