首先考虑简单的除法——n+1个字除以n个字得到的商是一个字。
给定非负整数和,不妨假设u/v<B,商应该怎样计算呢?Knuth给出了q的一个逼近(参见[2],§4.3.1):
…………(1.12)
如果
, …………(1.13)
则Knuth给出的逼近值与真实值之间不会相差太多(参见[2],§4.3.1,定理A和定理B):
。 …………(1.14)
也就是说这个逼近值的确非常接近真实商。
有了这个结果就可以考虑一般的除法了。
对给定的非负整数和,利用除法计算商和余数的算法如下(参见[2],§4.3.1,算法D):
───────────────────────────────────────
算法: 除法
1. [标准化]。让d为2的某个方幂,使得v×d满足(1.13)式。然后更新u、v:
1.1) ,
1.2)
2. [初始化j]。让j=m。
3. [计算]。让,让为对应的余数。测试条件或是否成立。如果成立,执行:
3.1) ,,
3.2) 如果,重复以上测试。
4. [乘与减]。。
5. [测试余数]。令。如果step4做减法的结果为负,则进入step6;否则跳转step7。
6. [修正]。让,
7. [j循环]。。如果,跳转step3;否则跳转step8。
8. [去标准化]。返回商,
返回余数。
───────────────────────────────────────
除法的过程可以参见下图:
图1.5 除法步骤图