多项式的天真评估如何不准确?

Emi*_*har 6 language-agnostic polynomial-math polynomials

在此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;
Run Code Online (Sandbox Code Playgroud)

或者(甚至更糟!),

p=c[0]+c[1]*x+c[2]*pow(x,2.0)+c[3]*pow(x,3.0)+c[4]*pow(x,4.0);
Run Code Online (Sandbox Code Playgroud)

来(计算机)革命,所有被认定犯有此类犯罪行为的人将被即决处决,他们的计划将不会!

(您可以在分析索引中找到您的版本中的页面,在"puns,particullary bad"条目下.我喜欢这本书.)

不这样做有两个原因:准确性和性能.评估多项式的​​正确方法是这样的:

-t * (0.319381530  +  t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + 1.330274429 * t))))
Run Code Online (Sandbox Code Playgroud)

我可以看到以任何沮丧的方式实施它的严重性能损失,但不是精确度惩罚.准确性有什么不好?

我找到了这本书,但在引用位的任何地方都找不到这些信息.

Dav*_*dmh 7

每个浮点运算只是一个近似值.此方法使用较少的操作,因此结果更准确.

当您拥有非常大或小的数字时,它还有另一个优势.假设所有系数都在相同的数量级,那么所有的项也具有相同的顺序.如果在x = 0.1时计算系数约为1的阶数为5的多项式,则直接的方法是增加0.1到10 ^ -5,从而失去准确性.

顺便说一句,这被称为霍纳的计划.

  • 或Ruffini方法/定理.在en-wiki中优先考虑准宗教战争.这很可能是荒谬的,因为这个评估方法很可能是这个时代的民间传说,只有Ruffini/Horner/Holdred作为其他结果的一部分写下来,例如最有效的多项式牛顿方法的实现. (2认同)