原码除法
原码除法跟原码乘法一样,符号位是单独处理的。
即商符由两数符号位进行异或运算求得,商值由两数绝对值相除(x*/y*)求得。
恢复余数法:当余数为负时,需加上除数,将其恢复成原来的余数。
-
1.符号位单独按两数符号异或求得;
参与运算的是绝对值的补码 -
2.判溢出, 要求|被除数| < |除数| (对小数而言)
(如果是整数,则要求|被除数| > |除数| ); -
3.被除数减去除数;
-
4.若所得.余数为正,相应位上商为1,余数左移一位,减去[y]补;
若余数为负,相应位上商为0,余数加上除数(恢复余数),再左移一位,加上[-y]补; -
5.重复第4步,直到求得所要求的商为止(移n次)
-
6.若最后一步余数为负,则需要恢复余数。
总结:从以上步骤可以看出,具有n位尾数的合法除法,需要逻辑移位n位,上商n+1次。
例:已知x=-0.10110,y=0.111111,试用原码恢复余数法计算[x/y]原?
解:n=5,移5位,上商6次。-y*=-0.11111,因此[-y*]=11.00001。
除数与被除数一正一负,所以商为负数。
[x/y]原=-0.10110。
余数在计算过程中被左移了5次:0.10110*2^(-5)=0.0000010110。
原码不恢复余数法:不需要恢复余数,将恢复余数的那个步骤定量地表达出来。
恢复余数的步骤:
余数>0 | 恢复余数法是将余数左移一位,减去除数 | R’=2R-y* |
---|---|---|
余数<0 | 先恢复余数,再左移一位,再减去除数 | R’=2R+y* |
乘以2相当于左移1位
除以2相当于右移1位
例:已知x=-0.10110,y=0.11111,试用原码不恢复余数法计算[x/y]原?
解:-y*=-0.11111,因此[-y*]=11.00001。
除数与被除数一正一负,所以商为负数。
[x/y]原=-0.10110。
补码不恢复余数法(加减交替法)
对于小数补码运算,商等于"-1"是被允许的。
算法规则:
- 符号位参加运算,除数与被除数均用双符号补码表示、
- 被除数与除数同号,被除数减去除数,被除数与除数异号,被除数加上除数。
- 余数与除数同号,商上1,余数左移一位减去除数; 余数与除数异号,商上0,余数左移一位加上除数。(注意:余数左移加上或减去除数后就得到了新余数。)
- 采用校正法包括符号在内,重复n+1次3.
[R]补与[y]补 | 商 | 新余数[Ri+1]补 |
---|---|---|
同号 | 1 | [Ri+1]补=2[Ri]补+[-y]补 |
异号 | 0 | [Ri+1]补=2[Ri]补-[y]补 |
注意,使用此运算规则,需要修正商符,末位恒置1,加上1+ 2 -n
可见,假商=0.001,需要加上1+2-n,由于这里n=4,所以商=0.001+1.0001=1.0011
[x/y]补=1.0011
余数左移了4次,最后余数需要乘以2-4。
补码的右移是补符号位,这里的余数是负数,右移时需要补1,即真正的余数为1.11111110。
总结:可见,n位小数补码除法共上商n+1次(恒置“1”也算上商一次),且共移位n次。
《计算机组成原理》唐朔飞
《天勤计组高分笔记》