重点内容:
1.定点补码加减运算;
2.定点补码加法运算溢出判断方法及其电路
3.定点原码、补码一位乘运算
4.定点原码一位除法(加减交替法)
5.浮点运算步骤(加减、乘除)
6.浮点数溢出判断方法
7.超前进位原理
一.定点数的加减法运算
1.补码加法运算
整数 [A]补+[B]补=[A+B]补 (mod 2n+1)
小数 [A]补+[B]补=[A+B]补 (mod 2)
2.补码减法运算
由A-B=A+(-B),则[A-B]补=[A+(-B)]补
整数 [A-B]补=[A+(-B)]补=[A]补+[-B]补 (mod 2n+1)
小数 [A-B]补=[A]补+[-B]补 (mod 2)
注:
①在计算机中求补时,超出范围字长不用管,相当于取模值
②当知道一个数,求它负数的补码的时候,“连同符号位取反+1”
3.溢出判断
(1)例如负数减去正数得到了一个正数:向高位进位后,发生了“溢出”。运算结果超出了机器字长的表示范围,出现这种现象的时候,要注意特别注明。
(2)上溢:两个正数相加,结果大于机器所能表示的最大正数,称为上溢。
(3)下溢:两个负数相加,结果小于其所能表示的最小负数,称为下溢。
(4)判断方法:
①用计算结果的符号位来判断溢出:
运算结果z,被加数x,加数y的符号位分别记作:z0,x0,y0。可得判断溢出的逻辑表达式为:
若v=1,则说明运算结果出现溢出。
②用计算结果最高数值位向符号位的进位值c1与符号位的进位值c0来判断溢出:
计算结果的最高位向符号位的进位值c1与符号位的进位值c0不同,则表明产生了溢出。判断溢出的逻辑表达式为:
若v=1,则说明运算结果出现溢出。
③采用双符号位进行判断
a.符号位用两个0(表示正数)或两个1(表示负数)来表示。两个符号位都看作为数码参加运算,若结果的两个符号位的值相同,则说明没有发生溢出;若结果的两个符号位不同,则说明发生了溢出。
b.运算结果的符号位为01时,表明两个正数相加,结果大于机器所能表示的最大正数,称为上溢,即正溢出;
c.运算结果的符号位为10时,表明两个负数相加,结果小于机器所能表示的最小负数,称为下溢,即负溢出。
d.用z0来表示最高符号位,z0′表示第二个符号位,判断溢出的逻辑表达式为:
若v=1,则说明运算结果出现溢出
e.存储数据时不必存储双符号位,只是在数据送往运算部件进行运算时才复制成双符号位
二.定点数乘法运算
1.核心硬件:加法器
2.定点原码一位乘法
(1)数值由原码表示
(2)部分积每次运算处理1位乘数尾数
(3)运算细节:
①符号位单独处理
②数值位绝对值做乘法运算
③取绝对值后的被乘数双符号位补码表示(计算机中的加减法都用补码处理)
④取绝对值后的乘数只有数值部分带入运算(决定每次与部分积相加值及移位次数)
(4)逻辑框图
注:
由乘数寄存器的最低位来控制。
被乘数与乘数寄存器联合右移。
乘法运算的第一位保存在乘数寄存器中。每一轮都存一次。
例:设x= -0.1101,y=0.1011,求x • y
[解] 计算过程如下:
1)[x]原=1.1101,[y]原=0.1011,zs= xs⊕ys=1。
2)被乘数的绝对值取双符号位放入B寄存器中,值为001101,同时移位寄存器C中放入的数为1011。
3)计算数值过程如下:
4)因为z s =1,所以最后的结果为:z=-0.10001111。
3.定点原码的两位乘法
与前面叙述的原码一位乘法比较,多出了+2x和+3x两种情况。把x左移1位即得2x,在机器内通常采用向左斜送1位来实现,但是+3x一般不能一次完成。实现+3x有如下两种方法:
1)先+x,再+2x来进行,此法速度较低。
2)以4x-x来代替3x运算,在本次运算中只执行-x,而+4x则归并到下一拍执行。此时的部分积已右移了两位,上一部欠下的+4x已变成+x.
(3)缺点:影响速度,运算复杂
例:假定x=0.100111,y=0.100111,利用定点原码两位乘法求x • y
[解] 计算过程如下:
1)先求符号位,zs= xs⊕ys=0;
2)采用三符号位,先求下面两个值:
[-x]补=111.011001,2x=001.001110;
3)计算数值过程如下:
4)因为z s= 0,所以z=+0.010111110001
4.定点补码的一位乘法运算
例:设x=-0.1101,y=0.1011,利用补码一位乘求x•y。(x<0,y>0)
[解] 计算过程如下:
[x]补=11.0011,x采用双符号位,[y]补=0.1011,y采用单符号位,先求[x•y]补。
由于最高位符号位y0=0,所以无需加-y0[x]补,最后结果为:
[x•y]补 = 11.01110001,
x•y = -0.10001111
5.布斯法
①运算开始时,部分积为0,然后在上一步的部分积上加(yi+1-yi)[x]补 (i=n,…2,1,0)再右移1位,得到新的部分积,如此重复n+1步,最后一步不移位,得到[x•y]补。
②Booth法运算规则
例:设x=-0.1101,y=0.1011(x<0,y>0),用布斯法求x•y(x<0,y>0)
[解] 计算过程如下:
[x]补=11.0011,[-x]补=00.1101 (采用双符号位表示)
[y]补=0.1011 ( 采用单符号位表示)
计算结果:[x•y]补=11.01110001,所以x•y= -0.10001111
三.定点除法运算
1.原码恢复余数除法
设两个正的定点小数,被除数x和除数y,用原码恢复余数法计算x/y的步骤如下:
(1)余数r1=x-y。若r1≥0,则商上1;否则商上0。
(2)若第i次的部分余数为ri,那么第i+1次的部分余数ri+1=2ri-y。若ri+1<0,则商上0,同时恢复余数:ri+1=ri+1+y;否则,商上1。
(3)重复第二步,直到求得所需商的位数为止。
例:设x=0.1011,y=0.1101,求x/y
[解] 计算过程如下:
先求得[-y]补=11.0011,目的是减y用加[-y]补取代;取双符号位,是为防止溢出。
计算结果为:
x/y =0.1101 余数=0.0111×2-4
2.加减交替除法
加减交替法是对恢复余数法的一种修正。当某一次求得的差值(余数ri)为负时,不是恢复它,而是继续求下一位商,但用加上除数(+y)的办法来取代减去除数(-y)操作,其他操作依然不变。
(1)若余数为正时,商上1,求下一位商的办法,是余数左移一位,再减去除数;
(2)当余数为负时,商上0,求下一位商的办法,是余数左移一位,再加上除数。
(3)此方法不用恢复余数,所以又叫不恢复余数法。但若最后一次商上0,而又需要得到正确的余数,则在最后一次还要+y恢复余数。
例:设x=0.1011,y=0.1101,用加减交替法求x/y
[解] 计算过程如下:
先求得[-y]补=11.0011,目的是减y用加[-y]补取代;取双符号位,是为防止溢出
计算结果为: x/y =0.1101 余数=0.0111×2-4
四.浮点数运算
1.浮点数表示方法
浮点数的表示方法,即在计算机中一个任意R进制数 N 可以写成:N=rE×M,式中M为尾数,可正可负,而且一般以纯小数形式表示。E是比例因子的指数,称为浮点数的阶码,可正可负,是一个整数。r是基数,可取2,4,8或16等。
2.浮点数加法和减法运算规则
(1)运算规则:设有两个浮点数x和y,它们分别为:x=2Ex•Mx,y=2Ey•My,其中Ex,Ey分别为数x和y的阶码,Mx和My为数x和y的尾数。且它们都是按规格化数存放的,对它们进行运算后的结果也应该是规格化的,其运算法则为:
z=x±y=Mx2^Ex – Ey^ ±My•2Ey(Ex<Ey)
(2)浮点数加减法运算步骤
①“对阶”操作:比较两浮点数阶码的大小,求出其差△E,并保留其大值E,E=max(Ex, Ey)。当△E ≠0时,将阶码小的数的尾数右移△E位,并将其阶码值加上△E,使两数的阶码值相等,这一操作称之为“对阶”。
注:尾数右移时,对原码表示的尾数,符号位不参加移位,尾数数值部分的高位补0;对补码表示的尾数,符号位参加右移,并保持原符号位不变。
②尾数的加/减运算
执行对阶后,两尾数进行加减运算,得到两数之和/差。
③规格化操作
a.当运算的结果(和/差)不是规格化数时,需将它转变成规格化数。规格化的目的是使尾数部分的绝对值尽可能以最大值的形式出现。
b.设尾数M的数值部分有n位,规格化数的范围为:
1/2≤|[M]原|≤1-2-n
1/2≤[M]补≤1-2-n (当M为正)
1/2≤|[M]补|≤1 (当M为负)
c.双符号位的原码规格化尾数,其数值的最高位为1;
双符号位的补码规格化尾数,应是00.1××…×或11. 0××…×(×可为0或1)。
d.双符号位补码规格化操作的规则是:
i.如果结果的两个符号位的值不同,表示加/减运算尾数结果溢出,此时将尾数结果右移1位,阶码E+1,称为“向右规格化”,简称“右规”。
ii. 如果结果的两个符号位的值相同,表示加/减运算尾数结果不溢出。但若最高数值位与符号位相同,此时尾数连续左移,直到最高数值位与符号位的值不同为止;同时从E中减去移位的位数,这称之为“向左规格化”,简称“左规”。
④舍入
在执行右规或对阶时,尾数低位上的数值会移掉,使数值的精度受到影响,为了减少运算中的精度损失,常用的尾数处理方法是“0”舍“1”入法。当移掉的最高位为1时,在尾数的未位加1,如果加1后又使尾数溢出,则要再进行一次右规。
⑤检查阶码是否溢出
阶码溢出表示浮点数溢出。在规格化和舍入时都可能发生溢出,若阶码正常,加/减运算正常结束。若阶码下溢,则置运算结果为机器零,若上溢,则置溢出标志。
例:两浮点数相加,被加数 x=2011×0.11011011,加数 y=2101×(-0.10101100),求x+y
[解] 计算过程如下:
假设两数的阶码和尾数均以补码表示,阶码采用双符号位,尾数采用单符号位,则它们的浮点数分别表示为:
x=00011 尾数:0.11011011
y=00101 尾数:1.01010100
1)对阶操作
阶差△E= Ex-Ey=[ Ex]补+[-Ey]补=00011+11011=11110
即△E=-2,x的阶码小,应使Mx右移两位,保留阶码E=00101。
[MX]补=000110110(11),其中(11)是右移出去而保留的附加位。
2) 尾数相加
[MX]补 +[My]补=0.00110110(11) +1.01010100=1.10001010(11)
3)规格化操作
尾数相加结果的符号位与最高数值位为同值,应执行左规处理,结果为1.00010101(10),阶码为00 100。
4)舍入
附加位最高位为1,在所得结果的最低位+1,得新结果:
[M]补=1.00010110, M=-0.11101010。
5)判溢出
阶码符号位为00,不溢出,故得最终结果为:
x + y=2100×(-0.11101010)
3.浮点数乘法和除法运算规则
(1)运算法则
设有两个浮点数x和y,它们分别为:
x=2Ex•Mx
y=2Ey•My
其中Ex,Ey分别为数x和y的阶码,Mx和My为数x和y的尾数。
则乘法运算规则是:x×y=2Ex+Ey•(Mx×My)
除法运算规则是: x÷y=2Ex-Ey•(Mx÷My)
(2)运算步骤
① 0操作数检查;
② 如果做乘法运算,阶码执行加操作;如果做除法运算,阶码执行减操作;
③ 尾数乘/除操作;
④ 结果规格化及舍入处理。
⑤ 判断结果是否溢出。
(3)舍入操作
当尾数用补码表示时(负数),所用的舍入规则,应该与用原码表示时产生相同的处理效果。具体规则是:
①当丢失的各位均为0时,不必舍入;
②当丢失的最高位为0,以下各位不全为0时,或者丢失的最高位为1,以下各位均为0时,则舍去丢失位上的值;
③当丢失的最高位为1,以下各位不全为0时,则执行在尾数最低位入1的修正操作。
(4)阶码(用移码)判定溢出的方法
使用双符号位的阶码(用移码)加法器,可以判断浮点数的溢出。这时规定移码的第二个符号位,即最高符号位恒用0参加运算,则溢出条件是最高符号位为1。此时,当低位符号位为0时,表明结果上溢;为1时,表明结果下溢。当最高符号位为0时,表明没有溢出,低位符号位为1,表明结果为正,为0时,表明结果为负。
例:设x=2-6× 0.0110011,y=24×(-0.1110010),阶码用四位移码表示,尾数(含符号位)用8位补码表示,求x×y(用浮点数表示)
[解] 计算过程如下:
移码采用双符号位,尾数补码采用单符号位,则有
[Mx]补=0.0110011,
[My]补=1.0001110
[Ex]移=00010,
[Ey]补=00100,
[Ey]移=01100
[x]浮= 000100.0110011,
[y]浮= 011001.0001110
1)求乘积的阶码
2)补码尾数相乘
[Mx]补×[My]补=[0.0110011]补×[1.0001110]补=[1.1010010,1001010]补
3)规格化处理
乘积的尾数符号位与最高数值位符号相同,不是规格化的数,故需要左规:
阶码变为00101(-3),
尾数变为1.0100101,0010100。
4)舍入处理
尾数低位部分最高位为0,舍去低位字长,故尾数为1.0100101。相乘最终结果为:
[x × y]浮 = 001011.0100101
真值: x × y =2-3×(-0.1011011)
5)判溢出
阶码符号位为00,未溢出,故结果正确。
五.超前进位原理
1.设计思想:为了提高加法器的运算速度,必须设法减小或去除由于进位信号逐级传送所花的时间,使各位的进位直接由加数和被加数来决定,而不需依赖低位进位。
2.超前进位产生电路是根据各位进位的形成条件来实现的。
3.原理:
只要满足下述条件中任一个即可形成C1
(1)X1,Y1均为“1”;
(2)X1,Y1任一个为“1”,且进位C0为“1”。由此,可写得C1的表达式为C1=X1Y1+(X1+Y1) C0
只要满足下述条件中任一个即可形成C2。
(1)X2,Y2均为“1”;
(2)X2,Y2任一为“1”,且X1,Y1均为“1”;
(3)X2,Y2任一为“1”,同时X1,Y1任一为“1”,且C0为“1”。由此可得C2表达式为
C2=X2Y2+(X2+Y2)X1Y1+(X2+Y2)(X1+Y1)C0
同理,可有C3,C4表达式如下:
C3=X3Y3+(X3+Y3)X2Y2+(X3+Y3)(X2+Y2)X1Y1+(X3+Y3)(X2+Y2)(X1+Y1)C0 (3-20)
下面我们引入进位传递函数Pi和进位产生函数Gi的概念。它们的定义为:Pi=Xi +Yi,Gi=Xi •Yi
式中i=1,2,3,4。Pi的意义是:当Xi,Yi中有一个为“1”时,若有进位输入,则本位向高位传送进位,这个进位可看成是低位进位越过本位直接向高位传递的。Gi的意义是:当Xi,Yi均为“1”时,不管有无进位输入,定会产生向高位的进位。
将Pi、Gi代入C1~C4式,便可得:(并行)
C1=G1+P1C0
C2=G2+P2G1+P2P1C0
C3=G3+P3G2+P3P2G1+P3P2P1C0
C4=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0
当全加器的输入均取反码时,它的输出也均取反码。据此,可把它们以“与非”、“或非”、“与或非”形式改写成如下形式:
由Pi、Gi定义,也可把半加和改写成以下形式: Hi=Pi⊕Gi
可画得“超前进位产生电路”及“四位超前进位加法器”的逻辑图如图所示。由图可以看到,只要X1~X4,Y1~Y4和C0同时到来,就可几乎同时形成C1~C4和F1~F4。