Floating point 计算多项式-浮点还是优化问题?

Floating point 计算多项式-浮点还是优化问题?,floating-point,Floating Point,根据数字配方: 我们假设您知道的足够多,永远不会以这种方式计算多项式: p=c[0]+c[1]*x+c[2]*x*x+c[3]*x*x+c[4]*x*x*x*x; 显然我知道的还不够 这仅仅是一个优化问题还是一个浮点算术问题?为什么?你可以计算p=c[0]+c[1]*x+c[2]*x*x+c[3]*x*x+c[4]*x*x*x*x作为: p=c[0]+(c[1]+(c[2]+(c[3]+c[4]*x)*x)*x)*x; 第二种形式的乘法要少得多。第二种形式称为“霍纳氏” 这只是一个优化问题还

根据数字配方:

我们假设您知道的足够多,永远不会以这种方式计算多项式: p=c[0]+c[1]*x+c[2]*x*x+c[3]*x*x+c[4]*x*x*x*x;

显然我知道的还不够


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

你可以计算
p=c[0]+c[1]*x+c[2]*x*x+c[3]*x*x+c[4]*x*x*x*x作为:

p=c[0]+(c[1]+(c[2]+(c[3]+c[4]*x)*x)*x)*x;
第二种形式的乘法要少得多。第二种形式称为“霍纳氏”

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

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

霍纳的形式非常适合于这种情况下的计算



最后,为了完整性起见,我应该指出,如果多项式以更并行的形式呈现给现代处理器,那么它们的效率会更高。例如,请参阅或以获得一个实际的解释。你的书并没有暗示要了解埃斯特林的计划。这只是暗指了解霍纳方案的要求。

是否也存在舍入问题,这可能会影响答案?@ClickRick我只能说“这也意味着结果更准确”在我的答案中已经有了。我在想如果使用OP中所示的形式,是否会有一些病理情况会产生完全错误的答案,可能是通过一个大的正项和一个大的负项相互抵消,但是通过使另一个项变小,会留下一个(错误的)结果为零。可能是另一个问题的主题。@ClickRick是的,这是一个你应该问的问题。我对这个问题的答案很感兴趣。请注意,有几种方法可以评估人类可读表单
c[0]+c[1]*x+c[2]*x*x+c[3]*x*x+c[4]*x*x*x*x
。当
x
较小时,最好的评估方法是从右向左添加,以限制吸收问题。如果这样做的话,我希望准确度是相似的。这很容易通过对浮点数的详尽测试进行经验测量,使用长双倍作为参考。除了Horner和Estrin的方案外,还可以计算因子形式的多项式。对于四次曲线,这看起来像
c*((x+a1)*x+a0)*((x+b1)*x+b0)
。注意:与Horner的吞吐量相同,但在流水线架构上延迟显著降低。问题是,如果多项式表现不好,分解(和因子取整)的过程可能会带来麻烦的干扰。如果你引用的文档也是,那么你只需在可怕的句子之后继续阅读即可。作者并不认为读者知道的足够多,但在接下来的几段中解释他们的意思。