2009-11-17 63 views

回答

3

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

两个表达式相差在两个地方:

  1. 评价顺序相反(...,C,B,a)用于在第一表达和(A,B,C,...)为第二个表达式。哪一个最好取决于系数的值。
  2. 第一个表达式的末尾有.../x**n。正如乔纳森解释的那样,出于这个原因,可能会期望第二个表达式更准确,因为它的操作更少。但是,我认为.../x**n只会导致精度损失最小(与其他您失去准确性的地方相比),除非x**n溢出或下溢。
+0

同意 - 加法和减法是精确度损失的真正罪魁祸首,这里没有任何真正的区别。 – 2009-11-17 11:45:32

5

从理论上讲,不应该有任何区别 - 如果值与“无限”的精度精确计算。

Kernighan和Plauger状态在他们的古董,但优秀的书“Elements of Programming Style”,即:

聪明的程序员曾经说过,“浮点数是像颗颗小堆;每次移动一次,你失去一点沙子,并获得一点污垢“。

该部门的整体作业略少,这意味着失去沙子和污垢的机会稍微减少。

详细的分析可能需要查看系数(a,b,c等)以及x的值 - 当x很大时,x很接近零时可能无法正常工作,反之亦然。

+0

+1对于报价,真的很有趣和有见地! – TheVillageIdiot 2009-11-17 04:12:49

0

提供的答案不正确。

第二个方程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中的小错误被天文放大。