Algorithm Knuth'的算法4.3.1D中是否存在缺陷;什么是TAOCP?
您可以找到算法4.3.1D的解释,如D.Knuth在本问题附录中的《计算机编程艺术》第2卷(第272-273页)中所述 似乎在步骤D.6中,Algorithm Knuth'的算法4.3.1D中是否存在缺陷;什么是TAOCP?,algorithm,division,off-by-one,Algorithm,Division,Off By One,您可以找到算法4.3.1D的解释,如D.Knuth在本问题附录中的《计算机编程艺术》第2卷(第272-273页)中所述 似乎在步骤D.6中,qhat预计最多关闭一次 让我们假设基数为2^32(即我们使用的是无符号32位数字)。让u=[23815782423548395522143027200,0]和v=[33217569622254962688]。该部门的预期产出为4081766756 u和v已经按照D.1中的描述进行了规范化(v[1]>b/2和u是零填充的) 循环D.3到D.7的第一次迭代没有
qhat
预计最多关闭一次
让我们假设基数为2^32
(即我们使用的是无符号32位数字)。让u=[23815782423548395522143027200,0]
和v=[33217569622254962688]
。该部门的预期产出为4081766756
u
和v
已经按照D.1中的描述进行了规范化(v[1]>b/2
和u
是零填充的)
循环D.3到D.7的第一次迭代没有op,因为在第一次迭代中qhat=floor((0*b+2143027200)/(2254962688))=0
在循环的第二次迭代中,qhat=floor((2143027200*b+2354839552)/(2254962688))=4081766758
我们不需要计算步骤D.4和D.5来了解这是一个问题的原因。由于qhat
将在D.6中减少1,因此算法的结果将为4081766758-1=4081766757
,但是,结果应为4081766756
我认为算法中存在缺陷,或者我的推理中存在谬误,这是对的吗
附录
没有bug;您正在忽略步骤D3中的循环: 在您的示例中,作为该测试的结果,在继续执行步骤D4之前,最初设置为4081766758的q̂值减小两次,先减小到4081766757,然后减小到4081766756
(很抱歉,我没有时间做出更详细的/恰当的回答。)很抱歉,以下内容无助于回答问题,只是一个提示:如第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̂