除法本质
十进制
若 x/y=a…b,x除y等于a余b。
则有 a*y+b = x
这里进行三次除法,得到一个余数。
由于是三次,所以商的数值位有三个。
0.211 / 0/985 = 0.214 余0.000210
将商写为r进制定义形式
商:0.214 = 2 * 10-1 + 1 * 10-2 + 4 * 10-3
除数:0.985 = 985 * 10-3
商 * 除数 = (985 * 2 * 10-4 )+ (985 * 1 * 10-5 )+ (985 * 4 * 10-6 )
= 0.1970 + 0.00985 + 0.00394
每次除法都是接近当前余数,而不超过当前的余数。
二进制
若机器字长位5位,含一位符号位4位数值位。x=0.1011,y=0.1101 求x/y
可以比作 (0.1011×24) / (0.1101×24) = 0.1101……0.00000111
若除数大于余数,商1,否则商0.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NMsDOhH-1666682985744)(C:\Users\17215\AppData\Roaming\Typora\typora-user-images\image-20221021225210161.png)]
+ | - | x | / | |
---|---|---|---|---|
ACC | 被加数、和 | 被减数、差 | 乘积高位 | 被除数、余数 |
MU | 乘数、乘积低位 | 商 | ||
X | 加数 | 减数 | 被乘数 | 除数 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0TjtgYKm-1666682985745)(C:\Users\17215\AppData\Roaming\Typora\typora-user-images\image-20221021225538974.png)]
原码除法
1、商和余数正负性进行异或运算
2、数值位取绝对值进行除法运算
若机器字长位5位,含一位符号位4位数值位。x=0.1011,y=0.1101 求x/y
|x| = 0.1011 |y| = 0.1101 [|y|]补 = 0.1101 [-|y|]补 = 1.0011
初始 ACC为被除数、MQ为0、X为除数。
MQ最后一位为当前要确定的商
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMYS2WWD-1666682985745)(C:\Users\17215\AppData\Roaming\Typora\typora-user-images\image-20221021231414414.png)]
恢复余数
需要左移n次,进行n+1次除法
默认商1,使用当前余数的补码和除数绝对值的相反数的补码相加放到ACC内。
(ACC)+ [-|y|]补 -> ACC
01011 + 10011 = 11110
若当前ACC符号位为1,说明当前商错误,应修改为0,并把ACC的值恢复原样,即ACC加除数绝对值的补码。
(ACC)+ [|y|]补 -> ACC
11110 + 01101 =01011
小数点在符号位的后面。
商加符号,余数应×2-n。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syxYrBCi-1666682985746)(C:\Users\17215\AppData\Roaming\Typora\typora-user-images\image-20221021232844599.png)]
# 若机器字长位5位,含一位符号位4位数值位。x=0.1011,y=0.1101 求x/y
|x| = 0.1011 |y| = 0.1101 [|y|]~补~ = 0.1101 [-|y|]~补~ = 1.0011
# 初始 ACC为被除数 MQ置为0
ACC 0.1011 MQ 0.000|0
X 0.1101
# 第一次除法商1,ACC+ 被除数绝对值的相反数的补码
ACC 1.1110 MQ 0.000|1
X 0.1101
## 除法操作后发现ACC符号位为1,恢复余数 ACC + 被除数绝对值的补码,商0并左移
ACC 1.0110 MQ 0.000|0
X 0.1101
# 第二次除法商1,ACC+ 被除数绝对值的相反数的补码
ACC 0.1001 MQ 0.000|1
X 0.1101
## 除法操作后发现符号位为0,左移
ACC 1.0010 MQ 0.001|0
X 0.1101
# 第三次除法商1,ACC+ 被除数绝对值的相反数的补码
ACC 0.0101 MQ 0.001|1
X 0.1101
## 除法操作后发现符号位为0,左移
ACC 0.1010 MQ 0.011|0
X 0.1101
# 第四次除法商1,ACC+ 被除数绝对值的相反数的补码
ACC 1.1101 MQ 0.011|1
X 0.1101
## 除法操作后发现ACC符号位为1,恢复余数 ACC + 被除数绝对值的补码,商0并左移
ACC 1.0100 MQ 0.110|0
X 0.1101
# 第五次除法商1,ACC+ 被除数绝对值的相反数的补码
ACC 0.0111 MQ 0.110|1
X 0.1101
## 除法操作后发现符号位为0,已进行n+1次除法,n次左移
得商+0.1101,余数为+0.0111×2^-5^
加减交替(不恢复余数法)
在恢复余数法中,若除法操作后,余数为负值,需要进行恢复余数。
若设当前负余数为a,除数绝对值补码为b
恢复余数为,左移,下一步又商1,相当于2余数+除数绝对值补码。
结果相当于2a+b
最后左移
这里可以使用这个变换,为加减交替法(不恢复余数法)。
步骤为:商0、左移、商1、加除数绝对值补码、左移
若最后余数为负,需要再进行交替为正。 这次会使左移n+1次。
一般情况下,上商n+1次,左移n次,做最后余数为负,这次会使左移n+1次。
# 若机器字长位5位,含一位符号位4位数值位。x=0.1011,y=0.1101 求x/y
|x| = 0.1011 |y| = 0.1101 [|y|]~补~ = 0.1101 [-|y|]~补~ = 1.0011
# 初始 ACC为被除数 MQ置为0
ACC 0.1011 MQ 0.000|0
X 0.1101
# 第一次操作商1,ACC+ 除数绝对值的相反数的补码
ACC 1.1110 MQ 0.000|1
X 0.1101
## 操作后发现ACC符号位为1,商0,左移,商1,ACC + 除数绝对值的补码,左移
ACC 1.0010 MQ 0.001|0
X 0.1101
ACC 0.1010 MQ 0.011|0
X 0.1101
# 第三次操作商1,ACC+ 除数绝对值的相反数的补码
ACC 1.1101 MQ 0.001|1
X 0.1101
## 操作后发现ACC符号位为1,商0,左移,商1,ACC + 除数绝对值的补码,此时已经上商5次,不需要移位
ACC 0.0111 MQ 0.110|1
X 0.1101
## 已进行n=5次上商
得商+0.1101,余数为+0.0111×2^-5^
补码除法(加减交替法)
符号参与运算
被除数/余数、除数,采用双符号位。
具体步骤
1、若被除数与除数同号,则被除数减去除数。异号则被除数加上除数。(注意是被除数,不是每一位的余数)
2、余数和除数同号、商1、余数左移一位减去除数。余数和除数异号、商0、余数左移一位加上除数。重复n次
3、最后商的末位恒置为1。
# 若机器字长位5位,含一位符号位4,n位数值位。x=+0.1000,y=-0.1011 求x/y
[x]~补~ = 00.1000 [y]~补~ = 11.0101 [-y]~补~ = 00.1011
# 初始 ACC为余数 MQ为0 X 为除数
ACC 00.1000 MQ 00000
X 11.0101
# 第一步发现被除数和除数符号不同、加除数
ACC 11.1101 MQ 00000
X 11.0101
# 第二步 发现余数与除数同号 商1 余数左移 减去除数
ACC 00.0101 MQ 00010
X 11.0101
# 第三步 发现余数与除数异号 商0 余数左移 加上除数
ACC 11.1111 MQ 00100
X 11.0101
# 第四步 发现余数与除数同号 商1 余数左移 减去除数
ACC 00.1001 MQ 01010
X 11.0101
# 第五步 发现余数与除数异号 商0 余数左移 加上除数
ACC 00.0111 MQ 10100
X 11.0101
# 第六步 只剩最后一位 固定商1
ACC 00.0111 MQ 10101
X 11.0101
# 最后得:余数为0.0111×2^-4^、商[x/y]~补~为1.0101 [x/y]~原~1.1011