评估多项式 - 浮点或优化问题?

时间:2014-06-07 10:25:37

标签: floating-point

来自Numerical Recipes:

  

我们假设你知道永远不会以这种方式评估多项式:   P = C [0] + C [1] * X + C [2] * X * X + C [3] * X * X * X + C [4] * X * X * X * X;   ...

显然我不够了解......

这只是一个优化问题还是浮点运算问题?为什么?

1 个答案:

答案 0 :(得分:11)

您可以将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]+(c[2]+(c[3]+c[4]*x)*x)*x)*x;

第二种形式的乘法次数要少得多。第二种形式称为“Horner's”。

  

这只是一个优化问题还是浮点运算问题?为什么?

这主要是一个优化问题。然而,一些现代处理器具有浮点运算,可以在单个指令中进行乘法和加法,而不需要对乘法进行中间舍入,虽然大多数程序员看到的好处仍然是优化,但这也意味着结果更准确

Horner的形式非常适合用fused-multiply-add instruction进行计算。


最后,为了完整起见,我应该指出,如果多项式以更多并行性的形式呈现给它们,现代处理器可以更高效。例如,请参阅Estrin's schemethis blog post以获得实用的解释。你的书并没有提到了解Estrin计划的要求。它只是提到了解霍纳计划的要求。