您可以在本问题的附录中找到《计算机程序设计艺术》第二卷(第272-273页)D. Knuth所述的4.3.1D算法的解释。
似乎在步骤D.6中,预计
假设基数为
我认为算法中存在错误,还是我的推理有误?
似乎在步骤D.6中,预计
qhat
最多会有一个偏差。假设基数为
2^32
(即我们使用无符号32位数字),让u = [238157824,2354839552,2143027200,0]
和v = [3321757696,2254962688]
。这个除法的期望输出是4081766756
Link。
“u”和“v”都已经按照D.1中所描述的进行了归一化(v[1] > b / 2
,并且“u”进行了零填充)。
循环D.3到D.7的第一次迭代是无操作的,因为在第一次迭代中,“qhat = floor((0 * b + 2143027200) / (2254962688)) = 0”。
在第二次迭代中,“qhat = floor((2143027200 * b + 2354839552) / (2254962688)) = 4081766758” 链接。
我们不需要计算步骤D.4和D.5就能看出这是一个问题。由于在D.6中qhat
将减少一,因此算法的结果将为4081766758 - 1 = 4081766757
,然而,结果应该是4081766756
链接。我认为算法中存在错误,还是我的推理有误?
qhat
最多会偏差一个” — 请注意算法之前给出的段落,其中提到“此算法在步骤 D3 中使用稍微改进的 q̂ 选择,保证 q = q̂ 或 q̂ − 1”。 - ShreevatsaR