0 0 0 0 1 0 1 0 开始R0=X +1 0 1 0 R1=X–Y 1 0 1 0 1 0 1 0 0 R1<0,则q4 =0,没有溢出 01 0 1 0 1 00 2R1(R和Q同时左移,空出一位商) + 01 1 0 R2 =2R1+Y 10 1 1 0 1 0 0 0 R2<0,则q3 = 0 01 1 0 1 0 0 0 2R2 (R和Q同时左移,空出一位商) + 01 1 0 R3 =2R2 +Y 11 0 01 0 0 0 0 R3<0,则q2 = 0 10 01 0 0 00 2R3 (R和Q同时左移,空出一位商) + 01 1 0 R3 =2R2 +Y 1 11 10 0 0 0 0 R4<0,则q1 =0 1 1 1 0 0 0 0 0 2R4(R和Q同时左移,空出一位商)
+ 01 1 0 R5 =2R4 +Y 0 1 0 0 0 0 0 01 R5>0,则q0 =1 商的数值部分为:00001。所以,[X/Y]原=00001 (最高位为符号位),余数为0100。 (5)将10和–6分别表示成补码形式为:[10]补= 0 1010 , [–6]补= 1 1010,计算过程如下:
先对被除数进行符号扩展,[10]补=00000 01010,[6]补= 0 0110 余数寄存器R余数/商寄存器Q说明
0 0 00 0 0 1 0 1 0 开始R0=[X] + 1 10 10 R1=[X]+[Y] 1 10 1 00 1 0 1 0 R1与[Y]同号,则q5 =1
1 0 1 0 01 0 101 2R1(R和Q同时左移,空出一位上商1) +0 0 1 1 0 R2 =2R1+[–Y] 11 0 1 01 0 10 1 R2与[Y]同号,则q4= 1,
1 0 1 0 10 1 0 1 1 2R2(R和Q同时左移,空出一位上商1) + 0 0 1 1 0 R3 =2R2+[-Y]
1 1 0 1 10 10 1 1 R3与[Y]同号,则q3 = 1
1 0 1 1 01 0 1 1 1 2R3(R和Q同时左移,空出一位上商1) + 00 1 1 0 R4=2R3+[–Y]
11 1 0 010 1 1 1 R4与[Y]同号,则q 2 = 1 11 0 0 10 1 1 1 1 2R4(R和Q同时左移,空出一位上商0) + 00 1 1 0 R5=2R4+[-Y] 11 1 1 1 0 1 1 1 1 R5与[Y]同号,则q1= 1,
11 1 1 01 1 1 11 2R5(R和Q同时左移,空出一位上商1) + 00 1 1 0 R6=2R5 +[–Y] 00 1 0 0 1 1 1 1 0 R6与[Y]异号,则q0 = 0,Q左移,空出一位上商1 + 00 0 0 0+1 商为负数,末位加1;余数不需要修正 0 0 1 0 0 1 1 1 1 1
所以,[X/Y]补=11111,余数为00100。
即:X/Y= – 0001B = – 1,余数为 0100B = 4 将各数代入公式“除数×商+余数= 被除数”进行验证,得:(–6)×(–1) +4= 10。
10.若一次加法需要1ns,一次移位需要0.5ns。请分别计算用一位乘法、两位乘法、基于CRA的阵列
乘法、基于CSA的阵列乘法四种方式计算两个8位无符号二进制数乘积时所需的时间。 参考答案:
一位乘法:8次右移,8次加法,共计12ns; 二位乘法:4次右移,4次加法,共计6ns; 基于CRA的阵列乘法:每一级部分积不仅依赖于上一级部分积,还依赖于上一级最终的进位,而每
一级进位又是串行进行的,所以最长的路径总共经过了8+2×(8–1)=22次全加器,共计约22ns;
基于CSA的阵列乘法:本级进位和本级和同时传送到下一级,同级部分积之间不相互依赖,只进行O(N)次加法运算,因此,共计约8ns。 11.在IEEE 754浮点数运算中,当结果的尾数出现什么形式时需要进行左规,什么形式时需要进行右规?
如何进行左规,如何进行右规? 参考答案:
(1)对于结果为±1x.xx……x的情况,需要进行右规。右规时,尾数右移一位,阶码加1。右规操作可以表示为:M b?M b ×2 -1,Eb?Eb+1。右规时注意以下两点:
a) 尾数右移时,最高位“1”被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。 b) 阶码加1时,直接在末位加1。
(2)对于结果为±0.00……01x……x的情况,需要进行左规。左规时,数值位逐次左移,阶码逐次减1,直到将第一位“1”移到小数点左边。假定k为结果中“±”和左边第一个1之间连续0的个数,则左规操作可以表示为:M b?M b ×2k,Eb?Eb–k。左规时注意以下两点:
a) 尾数左移时数值部分最左k个0被移出,因此,相对来说,小数点右移了k位。因为进行尾数相加时,默认小数点位置在第一个数值位(即:隐藏位)之后,所以小数点右移k位后被移到了第一位1后面,这个1就是隐藏位。
b) 执行Eb?Eb–k时,每次都在末位减1,一共减k次。
12.在IEEE 754浮点数运算中,如何判断浮点运算的结果是否溢出?
参考答案:
浮点运算结果是否溢出,并不以尾数溢出来判断,而主要看阶码是否溢出。尾数溢出时,可通过右规操作进行纠正。阶码上溢时,说明结果的数值太大,无法表示;阶码下溢时,说明结果数值太小,可以把结果近似为0。
在进行对阶、规格化、舍入和浮点数的乘/除运算等过程中,都需要对阶码进行加、减运算,可能会发生阶码上溢或阶码下溢,因此,必须对阶码进行溢出判断。 (有关对阶码进行溢出判断的方法可参见教材中相关章节。)
13.假设浮点数格式为:阶码是4位移码,偏置常数为8,尾数是6位补码(采用双符号位),用浮点运
算规则分别计算在不采用任何附加位和采用2位附加位(保护位、舍入位)两种情况下的值。(假定对阶和右规时采用就近舍入到偶数方式) (1)(15/16) ×27+(2/16) ×25 (2)(15/16) ×27–(2/16) ×25 (3)(15/16) ×25+(2/16) ×27 (4)(15/16) ×25–(2/16) ×27 参考答案(假定采用隐藏位): X= (15/16) ×27=0.111100B ×27=(1.111000)2×26 Y1= (2/16) ×25=0.001000B×25=(1.000000)2×22 Y2= (–2/16) ×25=–0.001000B×25=(–1.000000)2×22 K= (15/16) ×25=0.111100B ×25=(1.111000)2×24
J1= (2/16) ×27=0.001000B ×27=(1.000000)2×24 J2= (–2/16) ×27=–0.001000B ×27=(–1.000000)2×24
根据题目所给的各种位数,可以得到在机器中表示为:
[X]浮= 00 1110 (1)111000 [Y1]浮= 00 1010 (1)000000 [Y2]浮= 11 1010 (1)000000 [K]浮= 00 1100 (1)111000 [J1]浮= 00 1100 (1)000000 [J2]浮= 11 1100 (1)000000
所以,E x= 1110,Mx= 00 (1). 111000,E y1 = 1010,My= 00(1).000000,E y2 = 1010,My= 11(1).000000
Ek= 1100,MK = 00 (1). 111000,EJ1 = 1100,MJ1 = 00(1).000000,EJ2 = 1100,MJ2 = 11(1).000000
尾数M中小数点前面有三位,前两位为数符,表示双符号,第三位加了括号,是隐藏位“1”。 没有附加位时的计算:
(1) X+Y1
[ΔE]补= [E x]移+ [–[E y1]移]补(mod 2n) = 1110 + 0110 = 0100
ΔE = 4,根据对阶规则可知需要对y1进行对阶,结果为:E y1 = E x= 1110,My 1=000.000100 尾数相加:Mb = Mx+ My1 = 001. 111000+ 000.000100 = 001.111100,两位符号相等,数值部分最高位为1,不需要进行规格化,所以最后结果为:E=1110,M=00(1).111100, 即(31/32) ×27 (2) X+Y2
[ΔE]补= [E x]移+ [–[E y2]移]补(mod 2n) = 1110 + 0110 = 0100;
ΔE = 4,根据对阶规则可知需要对y2进行对阶,结果为:E y2 = E x= 1110,My2=111.111100 尾数相加:Mb = Mx+ My2 = 001. 111000+ 111.111100=001.110100,两位符号相等,数值部分最高为1,不需要进行规格化,所以最后结果为:E=1110,M=00(1).110100, 即(29/32) ×27 (3) K+J1
[ΔE]补= [EK]移+ [–[EJ1]移]补(mod 2n) = 1100 + 0100 = 0000; ΔE = 0,根据对阶规则可知不需要进行对阶。 尾数相加:Mb = MK+ MJ1 = 001. 111000+ 001.000000= 010.111000,两位符号不等,说明尾数溢出,需要进行右规,最后结果为:E=1101,M=00(1).011100, 即(23/32) ×26 (4) K+J2
[ΔE]补= [EK]移+ [–[EJ2]移]补(mod 2n) = 1100 + 0100 = 0000; ΔE = 0,根据对阶规则可知不需要进行对阶。
尾数相加:Mb = MK+ MJ2 = 00 1. 111000+ 111.000000 = 000.111000,两位符号相等,数值部分最高位为0,需要进行左规,所以最后结果为:E=1011,M=00(1).110000, 即(7/8) ×24
如果有两位附加位精度上会有提高,在对阶的时候要注意小数点后就不是6位,而是8位,最后两位为保护位和舍入位。但是由于本题6位尾数已经足够,再加2位附加位,其结果是一样的。
14.采用IEEE 754单精度浮点数格式计算下列表达式的值。
(1)0.75+(–65.25) (2)0.75–(–65.25) 参考答案:
x=0.75=0.110...0B =(1.10...0)2×2-1
y=–65.25 =– 1000001.01000...0B =(–1.00000101...0) 2×26 用IEEE 754标准单精度格式表示为:
[x]浮= 0 01111110 10...0 [y]浮= 1 10000101 000001010...0
所以,E x= 01111110,Mx= 0 (1). 1...0,E y = 10000101,My= 1(1).000001010...0
尾数Mx和My中小数点前面有两位,第一位为数符,第二位加了括号,是隐藏位“1”。 以下是计算机中进行浮点数加减运算的过程(假定保留2位附加位:保护位和舍入位) (1)0.75+ (–65.25)
①对阶: [ΔE]补= [E x]移+ [–[E y]移]补(mod 2n) = 0111 1110 + 0111 1011 = 1111 1001
ΔE = –7,根据对阶规则可知需要对x进行对阶,结果为:Ex = Ey= 10000101,Mx
=00.000000110...000
x的尾数Mx右移7位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出的2位
保留
②尾数相加:Mb = Mx+ My= 00.000000110...000+ 11.000001010 ...000 (注意小数点在隐藏位后) 根据原码加/减法运算规则,得:00.000000110...000+ 11.000001010...000 = 11.000000100…000 上式尾数中最左边第一位是符号位,其余都是数值部分,尾数后面两位是附加位(加粗)。
③规格化:根据所得尾数的形式,数值部分最高位为1,所以不需要进行规格化。
④舍入:把结果的尾数Mb中最后两位附加位舍入掉,从本例来看,不管采用什么舍入法,结果都一样,
都是把最后两个0去掉,得:Mb= 11.000000100…0
⑤溢出判断:在上述阶码计算和调整过程中,没有发生“阶码上溢”和“阶码下溢”的问题。因此,阶
码Eb= 10000101。
最后结果为Eb= 10000101,Mb= 1(1).00000010…0,即:–64.5。
(2)0.75–(–65.25)
①对阶: [ΔE]补= [E x]移+ [–[E y]移]补(mod 2n) = 0111 1110 + 0111 1011 = 1111 1001
ΔE = -7,根据对阶规则可知需要对x进行对阶,结果为:Ex = Ey= 10000110,Mx
=00.000000110...000
x的尾数Mx右移一位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出的位保
留
②尾数相加:Mb = Mx–My= 00.000000110...000 – 11.000001010...000 (注意小数点在隐藏位后) 根据原码加/减法运算规则,得:00.000000110...000– 11.000001010...000=01.00001000…000 上式尾数中最左边第一位是符号位,其余都是数值部分,尾数后面两位是附加位(加粗)。 ③规格化:根据所得尾数的形式,数值部分最高位为1,不需要进行规格化。
④舍入:把结果的尾数Mb中最后两位附加位舍入掉,从本例来看,不管采用什么舍入法,结果都一样,
都是把最后两个0去掉,得:Mb= 01.00001000…0
⑤溢出判断:在上述阶码计算和调整过程中,没有发生“阶码上溢”和“阶码下溢”的问题。因此,阶
码Eb= 10000101。
最后结果为Eb = 10000101,Mb= 0(1).00001000…0,即:+66。
思考题:对阶时发生什么情况,就可以不再继续进行计算?
15.假定十进制数用8421 NBCD码表示,采用十进制加法运算计算下列表达式的值,并讨论在十进制
BCD码加法运算中如何判断溢出。 (1)234+567 (2)548+729 参考答案: (1)234+567 001000110100
+ 0101 01100111 0111 10011011 + 0110 01111010 0001 + 0110 0000 10000000 0001 结果为: (801)10
(2)548+729 0000 010101001000
+ 00000111 00101001 0000 110001110001 + 0000 0110 0000 0110 00010010 0111 0111 结果为: (1277)10
在第(2)题中,如果是采用12位数表示加数548和729,则能看出最后得到的答案是1100 0111