Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Knuth'的算法4.3.1D中是否存在缺陷;什么是TAOCP?_Algorithm_Division_Off By One - Fatal编程技术网

Algorithm Knuth'的算法4.3.1D中是否存在缺陷;什么是TAOCP?

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的第一次迭代没有

您可以找到算法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.3D.7的第一次迭代没有op,因为在第一次迭代中
qhat=floor((0*b+2143027200)/(2254962688))=0

在循环的第二次迭代中,
qhat=floor((2143027200*b+2354839552)/(2254962688))=4081766758

我们不需要计算步骤D.4D.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̂