多项式评估准确性,乘法与除法

时间:2009-11-17 02:36:34

标签: algorithm floating-accuracy numerical-analysis

让我们说我在x中有多项式,除以x的幂:

p = (a + x(b + x(c + ..)))/(x**n)

效率除了,这将是更准确的数值计算,上面或使用除法:

p = (((a/x + b)/x + c)/x + ...)

感谢

3 个答案:

答案 0 :(得分:5)

理论上,应该没有任何区别 - 如果用'无限'精度准确计算出值。

Kernighan和Plauger用他们古老而又出色的书“Elements of Programming Style”说明:

  

一位聪明的程序员曾经说过,“浮点数就像一堆沙子;每次移动一个,你都会失去一点沙子并获得一点污垢。”

该部门的整体操作略少,这意味着失去沙子并获得污垢的机会略少。

详细的分析可能需要查看系数(a,b,c等)以及x的值 - 当x很大时,什么有用可能在x接近零时效果不好,也不是反之亦然。

答案 1 :(得分:3)

我认为差异很小,除非x**n有可能溢出或下溢,在这种情况下你应该使用第二个表达式。

这两个表达在两个地方有所不同:

  1. 第一个表达式的评估顺序(...,c,b,a)和第二个表达式的(a,b,c,...)相反。哪一个最好取决于系数的值。
  2. 第一个表达式最后有.../x**n。正如乔纳森所解释的那样,由于这个原因,可能会预期第二个表达式更准确,因为它的操作更少。但是,我认为.../x**n只会导致最低精度损失(与其他丢失准确性的地方相比),除非x**n溢出或下溢。

答案 2 :(得分:0)

遗憾的是,提供的答案是错误的。

第二个等式p =(((a / x + b)/ x + c)/ x + ...)只是边际更差 对于准确性而言,速度要差得多。

为什么?乘法的相对误差只有主线性项 和一个小的二次项。相反的划分引入更高,但 非常小的术语(立方,四次):

e =相对误差,两个术语的假定常数

a * b = a(1 + e) b(1 + e)= a b(1 + 2e + e ^ 2)//乘法

a / b = a(1 + e)/ b(1 + e)= a / b(1 + e)(1 + e + e ^ 2 + e ^ 3 + ...几何系列)//分割

因此除法总是比乘法更糟糕。 出于速度考虑:除法总是慢于乘法, 正常因素可以在3x - 10x之间变化。所以嵌套的分歧很多 如果不计算最后一个因子,则比嵌套乘法慢 x ^ n不是由pow(),而是通过嵌套乘法。

可以通过循环乘以结果来轻松计算x ^ n double power = x; for(n-1)  power * = x;

如果你使用pow(),请注意它通常由方便计算 指数和对数,花费的时间远远超过必要时间(100x)。

你是否意识到虽然双重和精确结果之间的误差仍然很小, 对于更高的n,多项式结果非常对x的变化敏感? 因此,如果您使用更高的n,请注意您的答案可能完全不合适 因为x中的小误差是天文数学放大的。