关于计算机:计算机是如何实现除法运算的

63次阅读

共计 3654 个字符,预计需要花费 10 分钟才能阅读完成。

二进制除法和十进制除法是统一的,都是采纳:将被除数从高位除起,每次计算失去的商保留,余数加下一位数再次进行除法,顺次将被除数所有位数运算结束,失去的商依照按程序组合,余数为最初一次运算后果。

[x]原 = 0.1011,[y]原 = 0.1101

  • 0.1011 ÷ 0.1101 = 0.1101 … 0.00000111

    • 1011 ÷ 1101 = 0
    • 10110 ÷ 1101 = 0.1 … 1001
    • 10010 ÷ 1101 = 0.11 … 0101
    • 01010 ÷ 1101 = 0.110
    • 10100 ÷ 1101 = 0.1101 … 0.00000111
  • 每做一次除法运算,如果被除数小于除数,商 0,否者商 1,在用余数减去除数,失去下一个被除数,以此循环
  • 符号位进行异或运算:0 ⊕ 0 = 0
  • 最终后果:0.1101,余数是 111

这是咱们人类通过除法的竖式计算失去的后果,商 0 还是商 1,是通过比大小决定的,计算机在做除法的时候总不能凭空比大小吧?还有每次做完除法后,余数的位数也是不确定的。

那计算机该如何实现除法呢?

通过后面的学习,咱们晓得运算器是由 ACC、MQ、X、ALU 组成。

ALU 是运算器的外围,计算的性能是由这部分它来实现的。ACC、MQ、X,它们是用来暂存操作和两头后果,通过指令交由 ALU 解决。

再除法运算中,各寄存器有不同的作用:

  • ACC:被除数、余数
  • MQ:商
  • X:除数

原码除法复原余数法

最终运算后果,商在 MQ 中,商的位数是数值位位数;余数在 ACC 中,余数的位数是 2^-n;运算后果的符号位独自解决:被除数的符号位 ⊕ 除数符号位。

运算过程

计算机每次都是商 1,如果不对,在改商 0,并复原余数。

如何判断商 1 对不对呢?

被除数 (除数) – 商: ACC - X -> ACC - [y] 原 -> ACC + [-y]补,如果余数是正数,则改商 0

因为商错了,所以上一步计算的余数是不对的,须要复原到之前的数,这时候机器必定是没有存储它的,须要通过计算失去。

如何失去之前的数呢?

[y][-y] 互为相反数,因为上一步是加 [-y]补 失去的余数,那当初加 [y] 补 失去之前的数(称为复原余数)。

所以须要先把 [y]补 [-y] 补 的机器码算进去

  • [y]原 = 0.1101[y]补 = 0.1101[-y]补 =1.0011

计算步骤

步骤操作ACCMQX
1被除数搁置到 ACC 中,MQ 置 0010110000001101
2MQ 商 1010110000101101
3ACC – X = ACC + [-y]补 = 01011 + 10011111100000101101
4ACC 是正数,ACC 须要复原到之前的余数,ACC + [y]补 = 11110 + 01101,MQ 从 1 变成 0010110000001101
5逻辑左移一位101100000001101
6MQ 商 1101100000101101
7ACC – X = ACC + [-y]补 = 10110 + 10011010010000101101
8ACC 是负数,不须要复原余数010010000101101
9逻辑左移一位100100001001101
10MQ 商 1100100001101101
11ACC – X = ACC + [-y]补 = 10010 + 10011001010001101101
12ACC 是负数,不须要复原余数001010001101101
13逻辑左移一位010100011001101
14MQ 商 1010100011101101
15ACC – X = ACC + [-y]补 = 01010 + 10011111010011101101
16ACC 是正数,ACC 须要复原到之前的余数,ACC + [y]补 = 11101 + 01101010100011001101
17逻辑左移一位101000110001101
18MQ 商 1101000110101101
19ACC – X = ACC + [-y]补 = 10100 + 10011001110110101101
20最终符号位:被除数的符号位 ⊕ 除数符号位 = 0 ⊕ 0 = 0

第 19 步,如果计算的后果是正数,还是要再进行一步复原余数,这里计算的后果是负数,所以就完结了,不再左移了。

这里逻辑左移了 4 次,上商 5 次,所以机器位数是 n 位,那么须要逻辑左移 n 次,上商 n+1

最终后果:

  • 商:0.1101
  • 余数:0.00000111

原码除法加减交替法(不复原余数法)

最终运算后果,商在 MQ 中,商的位数是数值位位数;余数在 ACC 中,余数的位数是 2^-n;运算后果的符号位独自解决:被除数的符号位 ⊕ 除数符号位。

运算过程

ACC - X = ACC + [-y]补 的值如果是正数,那么咱们会加上它相反数的补 ACC + [y] 补,这一步被称为复原余数。

  1. ACC + [-y]补 正数
  2. ACC + [-y]补 + [y]补 复原余数
  3. 2(ACC + [-y]补 + [y]补) 逻辑左移一位
  4. 2(ACC + [-y]补 + [y]补) - [y]补 减除数

简化得 2(ACC + [-y]补) + [y]补

  • ACC + [-y]补 如果是正数的话,将 MQ 改商 0
  • 逻辑左移一位(ACCMQ 都要逻辑左移)
  • MQ1,并且加上除数 [y]补

计算步骤

步骤操作ACCMQX
1置 0010110000001101
2MQ 商 1010110000101101
3ACC – X = ACC + [-y]补 = 01011 + 10011111100000101101
4ACC 是正数,MQ 改商 0111100000001101
5逻辑左移一位111000000001101
6MQ 商 1111000000101101
7ACC + X = ACC + [y]补 = 11100 + 01101010010000101101
8ACC 是负数,MQ 不必改010010000101101
9逻辑左移一位100100001001101
10MQ 商 1100100001101101
11ACC – X = ACC + [-y]补 = 10010 + 10011001010001101101
12ACC 是负数,MQ 不必改001010001101101
13逻辑左移一位010100011001101
14MQ 商 1010100011101101
15ACC – X = ACC + [-y]补 = 01010 + 10011111010011101101
16ACC 是正数,MQ 改商 0111010011001101
17逻辑左移一位110100110001101
18MQ 商 1110100110101101
19ACC + X = ACC + [y]补 = 11010 + 01101001110110101101
20最终符号位:被除数的符号位 ⊕ 除数符号位 = 0 ⊕ 0 = 0

第 19 步,如果计算的后果是正数,MQ 还是要进行改商 0,并左移再加上 [y]补,和复原余数法是一样的步骤。

这里逻辑左移了 4 次,上商 5 次,所以机器位数是 n 位,那么须要逻辑左移 n 次,上商 n+1

最终后果:

  • 商:0.1101
  • 余数:0.0111 × 2^-4 = 0.00000111

补码除法加减交替法

题目:[x]原 = 0.1000,[y]原 = 1.1011,[y]补 = 1.0101,[-y]补 = 0.1011

被除数和除数要用两位符号位:

  • [x]原 = 00.1000
  • [y]原 = 11.1011
  • [y]补 = 11.0101
  • [-y]补 = 00.1011

运算过程

判断被除数 (余数) 和除数的符号位

  1. 被除数和除数符号位判断

    • 同号,被除数减除数
    • 异号,被除数加除数
  2. 余数和除数符号位判断

    • 同号,MQ1ACCMQ 逻辑左移一位,余数减除数
    • 异号,MQ0ACCMQ 逻辑左移一位,余数加除数
  3. 循环第三步,循环的次数是机器位数

计算步骤

步骤操作ACCMQX
1置 000100000000110101
2ACC + X = ACC + [y]补 = 001000 + 11010111110100000110101
3ACC 和 X 同号,MQ 商 111110100001110101
4逻辑左移一位11101000010110101
5ACC – X = ACC + [-y]补 = 111010 + 00101100010100010110101
6ACC 和 X 异号,MQ 商 000010100010110101
7逻辑左移一位00101000100110101
8ACC + X = ACC + [y]补 = 001010 + 11010111111100100110101
9ACC 和 X 同号,MQ 商 111111100101110101
10逻辑左移一位11111001010110101
11ACC – X = ACC + [-y]补 = 111110 + 00101100100101010110101
12逻辑左移一位01001010100110101
13ACC + X = ACC + [y]补 = 010010 + 11010100011110100110101
14MQ 开端横置 100011110101110101
15最终符号位:ACC 中的符号位 00

第 14 步最终计算的后果,开端要横置 1,其精度误差 2^-4

这里逻辑左移了 4 次,上商 5 次,所以机器位数是 n 位,那么须要逻辑左移 n 次,上商 n+1

最终后果:

  • 商:1.0101
  • 余数:0.0111 × 2^-4 = 0.00000111

总结

原码的除法运算和补码的除法运算的左移都是逻辑左移。

机器位数是 n 位,那么须要逻辑左移 n 次,上商 n+1 次,

  • 补码除法运算最初一步横置 1,其精度误差 2^-4
正文完
 0