让我们说我有X多项式,通过x的功率分为:多项式评价的准确性,乘法与除法
p = (a + x(b + x(c + ..)))/(x**n)
效率不谈,这将是更准确的计算数值,上述或使用部门:
p = (((a/x + b)/x + c)/x + ...)
感谢
让我们说我有X多项式,通过x的功率分为:多项式评价的准确性,乘法与除法
p = (a + x(b + x(c + ..)))/(x**n)
效率不谈,这将是更准确的计算数值,上述或使用部门:
p = (((a/x + b)/x + c)/x + ...)
感谢
我认为差异很小,除非有机会x**n
溢出或下溢,在这种情况下,您应该使用第二个表达式。
两个表达式相差在两个地方:
.../x**n
。正如乔纳森解释的那样,出于这个原因,可能会期望第二个表达式更准确,因为它的操作更少。但是,我认为.../x**n
只会导致精度损失最小(与其他您失去准确性的地方相比),除非x**n
溢出或下溢。从理论上讲,不应该有任何区别 - 如果值与“无限”的精度精确计算。
Kernighan和Plauger状态在他们的古董,但优秀的书“Elements of Programming Style”,即:
聪明的程序员曾经说过,“浮点数是像颗颗小堆;每次移动一次,你失去一点沙子,并获得一点污垢“。
该部门的整体作业略少,这意味着失去沙子和污垢的机会稍微减少。
详细的分析可能需要查看系数(a,b,c等)以及x的值 - 当x很大时,x很接近零时可能无法正常工作,反之亦然。
+1对于报价,真的很有趣和有见地! – TheVillageIdiot 2009-11-17 04:12:49
提供的答案不正确。
第二个方程p =((((a/x + b)/ x + c)/ x + ...)对于精确度只有边际更差,对速度来说差得多。
为什么?乘法的相对误差只有主要线性项 和一个小的二次项。司在相反引入较高,但 非常小的术语(立方体,四次):
E =相对误差,对于这两个术语
A * B =(1 + E)B(假定为常数1+ e)= a b(1 + 2e + e^2)//乘法
a/b = a(1 + e)/ b(1 + e)= a/b(1 + e) + E + E^2 + E^3 + ...几何系列)//除法
所以除法总是比乘法差一点。 出于速度考虑:分区总是慢于乘法, 正常因子可以从3x - 10x变化。因此,如果不通过pow()计算最后一个因子 ,而是通过嵌套乘法计算,则嵌套的分割比嵌套的乘法要慢 。
x^n可以很容易地通过循环乘以结果来计算 double power = x;对于(n-1) 功率* = x;
如果您使用pow(),请注意它主要是通过 指数和对数计算得来,所需时间远远超过必要(100x)。
您是否知道虽然双精度结果和精确结果之间的误差仍然很小,但多项式结果为非常有效对于更高n值的x变化很敏感? 所以,如果你使用更高的n值得注意,你的答案可能完全脱离标记 ,因为x中的小错误被天文放大。
同意 - 加法和减法是精确度损失的真正罪魁祸首,这里没有任何真正的区别。 – 2009-11-17 11:45:32