【发布时间】:2020-06-14 04:50:20
【问题描述】:
你可以找到算法 4.3.1D 的解释,它出现在计算机编程艺术卷。 2(第 272-273 页)由 D. Knuth 在本问题的附录中撰写。
看来,在步骤 D.6 中,qhat 预计最多减一。
让我们假设基数是2^32(即我们正在使用无符号的 32 位数字)。让u = [238157824, 2354839552, 2143027200, 0] 和v = [3321757696, 2254962688]。该部门的预期输出为4081766756Link
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)) = 4081766758Link。
我们不需要计算步骤 D.4 和 D.5 来了解为什么会出现问题。由于qhat在D.6中会减1,所以算法的结果会是4081766758 - 1 = 4081766757,但是结果应该是4081766756Link。
我是否认为算法中存在错误,或者我的推理存在谬误?
附录
【问题讨论】:
-
对不起,以下内容无助于回答问题,而只是一个注释:如第 1 卷第 2 页所述,在 TAOCP 书籍中,算法被赋予字母名称并在本地由该字母引用在该部分内,但除此之外,它们的“正确”名称包括该部分名称。因此,在这种情况下,您的意思是“算法 4.3.1D”(第 2 卷第 272-273 页)(第 4 章算术,第 4.3 节多精度算术,第 4.3.1 节经典算法)。
-
关于"看来,在步骤D.6中,
qhat预计最多减一" --请注意给出算法之前的段落,它说“该算法在步骤 D3 中使用了稍微改进的 q̂ 选择,这保证了 q = q̂ 或 q̂ − 1” -
您似乎遗漏了 D3 的最后一部分,其中涉及“如果 r̂
-
坦率地说,我认为我没有时间写答案。但简短的版本是 D3 中有一个循环,您执行了 0 次而不是正确的次数。
-
(顺便说一句,为一个明确的问题+1。我不知道为什么有人投票以“需要详细信息或澄清”来结束这个问题!)
标签: algorithm division off-by-one