【问题标题】:How is naive evaluation of polynomials bad for accuracy?多项式的朴素评估对准确性有何不利影响?
【发布时间】:2023-03-04 09:35:01
【问题描述】:

在此代码审查答案中:

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

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

(您可以在分析索引中的“双关语,特别糟糕”条目下找到您所在版本的页面。我喜欢这本书。)

不这样做的原因有两个:准确性和性能。计算多项式的正确方法是这样的:

-t * (0.319381530  +  t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + 1.330274429 * t))))

我可以看到以任何不鼓励的方式实施它会导致严重的性能损失,但不会导致准确性损失。 对准确性有何影响?

我找到了这本书,但在引用位周围的任何地方都没有此信息。

【问题讨论】:

  • 有人投票结束是主观的,我真的不认为这是一个主观问题!我将标题从“为什么”改为“如何”,以更清楚地表达自己。

标签: language-agnostic polynomial-math polynomials


【解决方案1】:

每个浮点运算只是一个近似值。该方法运算量少,结果更准确。

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

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

【讨论】:

  • 或 Ruffini 方法/定理。在 en-wiki 中优先考虑准宗教战争。这很可能是荒谬的,因为这种评估方法很可能是这个时代的民间传说,并且只是由 Ruffini/Horner/Holdred 作为其他结果的一部分写下来,例如多项式牛顿法的最有效实现。
猜你喜欢
  • 1970-01-01
  • 2019-05-15
  • 2016-10-19
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2017-11-06
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多