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

时间:2014-08-08 12:45:30

标签: 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;
         

或(更糟糕的是!),

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))))

我可以看到以任何沮丧的方式实施它的严重性能损失,但不是准确性惩罚。 准确性有多糟糕?

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

1 个答案:

答案 0 :(得分:7)

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

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

顺便说一下,这叫做Horner's scheme.