定点数的除法运算

原码除法运算

  • 恢复余数法
    • 基本思想:每次试商(减去除数),如果余数为负,则表示商位为 0,需要“恢复”余数(加回除数),然后左移;如果余数为正,则商位为 1,直接左移。
    • 步骤:部分余数左移一位,减去除数,判断余数符号。若为,商 0,恢复余数;若为正,商 1。

恢复余数法原理

硬件逻辑实现

  • 不恢复余数法
    • 基本思想:避免了恢复余数的步骤,通过交替加减操作来处理余数。
    • 步骤:
      1. 部分余数和除数符号相同:作减法。
      2. 部分余数和除数符号不同:作加法。
      3. 根据操作结果的余数符号确定下一商位(0 或 1)。
    • 效率高于恢复余数法。
    • 注意
      • 起始操作: 在进行第一次加减操作前,需要将部分余数(或被除数的高位)左移一位
      • 商位确定规则的细化: 在每次操作(加或减)后,根据操作结果(新的部分余数)的符号来确定当前商位:
        • 若操作后的新部分余数除数符号相同,则当前商位为 1
        • 若操作后的新部分余数除数符号不同,则当前商位为 0
      • 下一次操作的确定: 下一次操作的类型(加或减)取决于当前部分余数的符号(即本次操作后的结果)。
        • 若当前部分余数为正,下一步做减法
        • 若当前部分余数为负,下一步做加法
        • (更通用地,应遵循基本思想:若部分余数与除数符号相同,下一步做减法;若不同,下一步做加法。)
      • 最终余数校正: 当所有商位确定后,若最终得到的部分余数与被除数符号不同(通常是负数),则需要进行恢复余数操作(即加上除数),以得到正确的最终余数。
      • 特殊情况处理: 若运算过程中部分余数为零,则后续商位均为零。
      • 与恢复余数法的区别: 不恢复余数法在余数符号不符时,不需要撤销操作(即不用恢复余数),而是直接进行相反操作,从而省去了回退步骤,提高了运算效率。

补码除法运算

  • 不恢复余数法
    1. 初始化
      • 被除数的数值部分放入商寄存器 Q,部分余数寄存器 A 通常初始化为 0 或与被除数符号位相同。
      • 确定除数 D 的补码形式以及其负数的补码形式(即 [-D] 补)。
      • 商的符号预判:根据被除数和除数的符号(异或结果)确定最终商的符号。若两者符号相同,商为正;若不同,商为负。
    2. 迭代运算(通常进行 n+1 次,n 为数值位数):
      • 左移: 将部分余数寄存器 A 和商寄存器 Q 的内容整体左移一位。A 的符号位不变,Q 的最低位移出,A 的最低位进入 Q 的最高位。
      • 判断操作:
        • 部分余数 A的符号与除数 D的符号相同,执行 A = A + (-D)补 (即 A 减去 D)。
        • 部分余数 A的符号与除数 D的符号不同,执行 A = A + D (即 A 加上 D)。
      • 确定商位:
        • 若操作后的新部分余数 A的符号与除数 D的符号相同,则当前商位为 1
        • 若操作后的新部分余数 A的符号与除数 D的符号不同,则当前商位为 0
        • 将确定的商位填入 Q 寄存器的最低位。
    3. 最终余数校正
      • 当所有商位确定后,A 寄存器中存放的是最终的部分余数。
      • 若最终余数 A 的符号与被除数 X 的符号不同(例如,被除数为正但最终余数为负,或被除数为负但最终余数为正):
        • 执行恢复操作:若 A 为负,则 A = A + D (加上除数 D);若 A 为正,则 A = A + (-D)补 (减去除数 D)。
        • 校正后的余数 R 应满足:R 的符号与被除数 X 的符号相同,且 |R| < |D|。
    4. 最终商的形成
      • Q 寄存器中存储的是商的数值部分。
      • 结合第一步预判的商的符号,得到最终的商。若商为负,通常需要将 Q 寄存器中的数值取补码形式。