天勤论坛:www.csbiji.com
天勤论坛——专为计算机考研学子打造的专业交流平台
期待你的加入!
一直移到满足补码规格化的形式为止,至于要移动多少次是不确定的,以上步骤称为左规。
·当尾数求和后出现01.XXX...X或者10.XXX...X,看到这个考生应该想到前面讲解过的变形补码判断溢出的方式,两位符号位不同,表示溢出,可见尾数溢出了。但是,这在浮点数中不算溢出,可以通过右移来纠正。右移一位,阶码加1。细心的读者可能会发现,这种形式只要右移一次就可以变成规格化数,01.XXX...X右移一位变成00.1XXX...X;10.XXX...X右移一位变成11.0XXX...X,请考生注意出选择题,以上步骤称为右规。
规格化解决了,浮点数的第三步操作也就完成了。但是在对阶和右移的过程中,很有可能会导致尾数的低位丢失,这样就会引起误差,影响精度。因为可以使用舍入法来提高尾数的精度,常用的舍入法有以下两种:
(1)“0舍1入”法
“0舍1入”法类似与十进制中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样很有可能导致尾数又溢出,此时需要做一次右规。例如00.1111末尾加1,就变成01.0000,此时需要右规。
(2)“恒置1”法
尾数右移时,不论丢掉的最高数值位是“1”或“0”,都使右移后的尾数末位恒置“1”。以上关于浮点数的加减运算可以总结为如下4大步骤:①对阶,使两数的小数点位置对齐
②尾数求和,将对阶后的两尾数按定点加减运算规则求和或者差
③规格化,为增加有效数字的位数,提高运算精度,必须将求和或差后的尾数规格化④舍入,为提高精度,要考虑尾数右移时丢失的数值位
当然,以上四大步骤完成之后,还需要检查一下最后的结果是否溢出,由于浮点数的溢出完全是用阶码来判断的,假设阶码采用补码来表示的话,溢出就可以使用双符号位判断溢出的方式来判断此浮点数是否溢出,过程如下:
if(阶符==01)
上溢,需做中断处理;elseelse
结果正确;
以上过程为完整的浮点数加减运算过程,下面请看实例演示。
【例2.2.5】已知十进制数X=-5/256,Y=+59/1024,按机器补码浮点运算规则计算X-Y,结果用二进制表示,其中浮点数格式如下:数的阶符取2位,阶码取3位,数符取2位,尾数取9位(舍入时采用0舍1入法)。
解:首先将X和Y转换成浮点数,如下:
if(阶符==10)下溢,按机器零处理;
X=?5/256=2?101×(11.101000000)
Y=59/1024=2?100×(00.111011000)
jx=11101,所以[jx]补=11011,同理?jy补=00100
[]
故:
[X]补=11011,11.011000000
天勤论坛:www.csbiji.com
天勤论坛——专为计算机考研学子打造的专业交流平台
期待你的加入!
[Y]补=11100,00.111011000
下面可以按照五大步骤来做:①对阶求阶差:?j
[]=[j]?[j]
补
x补
y补
=
[jx]补+[?jy]补
=11011+00100
=11111(补码全1表示-1,前面讲解过)
所以X的阶码要低1,故应该X向Y对齐,X尾数需要右移一位,阶码加1,如下:
[X]补=11100,11.101100000
②尾数求差
11.101100000+11.00010100010.110001000
即[X?Y]补=11100,10.110001000③规格化
尾数出现10.XXX...X,说明需要右规一次即可,阶码加1,最后可得:
(这里加的是Y尾数的负数补码)
[X?Y]补=11101,11.0110001000加了下划线的0为右规丢弃的0
④舍入处理
由于右规低位丢0,直接舍去。⑤溢出判断
最后阶符为11,没有溢出,最后应将[X?Y]补=11101,11.011000100转换为真
值。阶码为11101,换成原码为11011,说明真实值为-3;同理尾数为:-0.1001111,故最后的结果为:
2?3×(?0.1001111)
17.串行加法器和并行加法器总结
讲解串行加法器和并行加法器之前,先大致介绍一下全加器的结构。而全加器说白了就是一个加法单元,而一个加法单元是一个三端输入两端输出的加法网络,结构如下:
Ci↑
∑i↑
↑Ai其中:向高位的进位,
↑Bi↑Ci?1
i?1组成的
Ai、Bi、Ci?1分别代表被加数Ai、加数Bi和低位传来的进位;Ci代表本位
∑i代表和S。很容易得出一个结论,当A、B、Ciii3位二进制
天勤论坛:www.csbiji.com
天勤论坛——专为计算机考研学子打造的专业交流平台
期待你的加入!
数中1的个数为奇数位时,
∑
i=1;当Ai、Bi、Ci?1组成的3位二进制数中1的个数大于
等于2时,Ci=1。所以就可以写出如下的逻辑表达式:
∑i=AiBiCi?1
+AiBiCi?1+AiBiCi?1+AiBiCi?1(其实就是100、010、001、111时,∑i=1)
Ci=AiBiCi?1+AiBiCi?1+AiBiCi?1+AiBiCi?1(其实就是110、101、011、111时,Ci=1)
其中:Ai表示此时Ai为1,Ai表示此时Ai为0,其他以此类推。
从上面的两个逻辑表达式不难看出,加法器的逻辑结构只涉及到两个方面:一个是求和单元;另一个则是进位链的问题。下面我们来逐一讨论。
补充知识点:半加器和全加器的区别是什么?
解:全加器是一个三端输入两端输出的加法网络,而半加器是一个两端输入两端输出的加法网络,也就是说半加器不需要进位信号的输入。而两个半加器又可以组成一个全加器,OK,点到为止,半加器知道这么多足以应付考研。
17.1串行加法器
串行加法器:只设一个全加器的加法器称为串行加法器。典型的串行加法器只用一位全加器。两个操作数分别放在两个移位寄存器中,并且由移位寄存器从低位到高位串行的提供操作数进行相加。如果操作数长16位,就需要分成16步进行,每步产生一位和,串行的送入结果寄存器,而产生的进位信号只需要一位触发器即可,每完成一步用新的进位覆盖旧的进位。结构如下图所以:
最后所得结果存放在存放操作数A的那个寄存器。
但是这样计算实在太慢了,每次都是一位参与运算,如果此时操作数为16位的话,就要进行16次串行操作,显然速度得不到提高,这个是设计者不可能接受的。现在就要想了,为什么不设置多个全加器一起运算?如果操作数有16位,就设置16个全加器一起运算,显然速度会提升,并行加法器就呱呱落地了....
17.2并行加法器
17.2.1并行加法器之串行进位链
并行加法器由若干个全加器构成,如下图所示。那么多个加法器并行工作到底能不能提升运算速度?能够提升多少?下面来详细分析一下。
从下图中可以很容易的看出这种加法器虽然解决了求和的一些延迟,但是可惜的是低位向高位产生的进位却来的太晚了,所以说提高加法器的运算速度仍然是一句空话。这种一级一级传递进位的过程被世人称为串行进位链(下面会给出串行进位链的逻辑表达式,观察起来会更直观)。于是世人天天在琢磨,如果所有的进位信号是同时产生的那该多好,想得到
天勤论坛:www.csbiji.com
天勤论坛——专为计算机考研学子打造的专业交流平台
期待你的加入!
就肯定做的到,于是并行进位链就那个了,你懂的。
17.2.2并行加法器之并行进位链
从上面的分析可知,要想提高运算速度,一定要改善进位链,所以接下来主要从进位链着手来解决问题。
进位链:通常我们将各位之间传递进位信号的逻辑连接构成的进位线路称为进位链。显然,要讨论进位链,就要从进位函数开始讨论。
前面算过进位函数的逻辑表达式为:
Ci=AiBiCi?1+AiBiCi?1+AiBiCi?1+AiBiCi?1
=AiBi(Ci?1+Ci?1)+(AiBi+AiB)iCi?1=AiBi+(Ai⊕Bi)Ci?1
其中⊕为异或操作,前面详细讲解过,不再赘述。可能疑问点:(Ai⊕Bi)Ci?1是什么意思?
解:低位产生的进位到底能不能向更高位传递,完全取决于Ai⊕Bi,如果Ai⊕Bi=0,那么进位链就断了;如果Ai⊕Bi=1,低位产生的进位就可以通过第i位向更高位传递。于是称Ai⊕Bi为进位条件,记作pi。该式子也可以这么理解,如果低位产生进位的话,当前
Ai和Bi如果是1和0或者是0和1的话,又可以向前进位了;如果Ai和Bi都是0的话肯定
不能进位了,这次的进位链就断了。
另外,AiBi项取决于本位参加的两个数,而与低位的进位无关。因此,AiBi为第i位的进位函数,或称本地进位(本位进位),记作Gi。
综上,可将进位逻辑表达式抽象为:
Ci=Gi+PiCi?1
根据这个表达式我们可以得到并行加法器之串行进位链的逻辑表达式:
天勤论坛:www.csbiji.com
天勤论坛——专为计算机考研学子打造的专业交流平台
期待你的加入!
从逻辑表达式中可以很直观的看出,每一级进位直接依赖于前一级的进位,也就是上面提到的串行进位。
所以,要想提高运算速度,必须将上图中的链斩断,也就是说C2、C3、C4不再依赖于前面的进位,也就是说并行加法器中的进位信号是同时产生的,并称之为并行进位链。
并行进位链又分为两种:单重分组跳跃进位和双重分组跳跃进位。(1)单重分组跳跃进位(浮云,了解)
单重分组跳跃进位链就是将n位全加器分成若干小组,小组内的进位同时产生,小组与小组之间采用串行进位,这种进位又被世人称为组内并行、组间串行。
仍然以四位并行加法器为例,可对串行进位链的逻辑表达式进行变换,这种变换应该从数学的角度来思考,即怎么把数据相关项消去,很自然的想到代入法,如下:
这个式子太给力了,可以同时产生进位了,那速度提高了吗?提高了多少?这个不用管了,考研只需要定性的分析确实是提高了,但是定量不需要掌握。
下图是单重分组进位链框图:
从上图中可以很直观的看出,每个小组内的进位是并行的,而小组之间确是串行的进位。现在的问题是,这种速度还是比较慢,因为每一小组都依赖于上一小组的最高进位,也就是说C4依赖于C3,C8依赖于C7,C12依赖于C11,这样的速度肯定还不是最佳的,于是经过改进形成了分组并行进位方式(双重分组进位链),也就是组内并行,组间也并行。关于单重分组并行进位了解这么多即可。
(2)双重分组进位链(更是浮云,稍作了解)
双重分组并行进位就是将n位全加器分成若干大组,每个大组中又包含若干小组,而每个大组内所包含的各个小组的最高位进位是同时产生的,大组与大组之间采用串行进位。因各个小组最高位进位是同时形成的,故小组内的其他进位也肯定是同时形成的(注意:小组内的其他进位与小组的最高进位并不是同时产生的),如下图所示:
相关推荐: