在此Code Review答案中:
https://codereview.stackexchange.com/a/59405/11633
我发现了以下内容(提前嵌套引用!):
让我引用精彩的C ++数字食谱(但也适用)
我们假设你知道永远不会以这种方式评估多项式:
p=c[0]+c[1]*x+c[2]*x*x+c[3]*x*x*x+c[4]*x*x*x*x;
或(更糟糕的是!),
p=c[0]+c[1]*x+c[2]*pow(x,2.0)+c[3]*pow(x,3.0)+c[4]*pow(x,4.0);
来(计算机)革命,所有被认定犯有此类犯罪行为的人将被即时处决,他们的计划将不会被执行!
(您可以在分析索引中找到您的版本中的页面,在条目下#34;双关语,特别是错误"。我喜欢这本书。)
不这样做有两个原因:准确性和性能。评估多项式的正确方法如下:
-t * (0.319381530 + t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + 1.330274429 * t))))
我可以看到以任何沮丧的方式实施它的严重性能损失,但不是准确性惩罚。 准确性有多糟糕?
我找到了这本书,但在引用位的任何地方都找不到这些信息。
答案 0 :(得分:7)
每个浮点运算只是一个近似值。此方法使用较少的操作,因此结果更准确。
当您拥有非常大或小的数字时,它还有另一个优势。假设所有系数都在相同的数量级,那么所有的项也具有相同的顺序。如果在x = 0.1时计算系数约为1的阶数为5的多项式,则直接的方法是增加0.1到10 ^ -5,从而失去准确性。
顺便说一下,这叫做Horner's scheme.