让我们说我在x中有多项式,除以x的幂:
p = (a + x(b + x(c + ..)))/(x**n)
效率除了,这将是更准确的数值计算,上面或使用除法:
p = (((a/x + b)/x + c)/x + ...)
感谢
答案 0 :(得分:5)
理论上,应该没有任何区别 - 如果用'无限'精度准确计算出值。
Kernighan和Plauger用他们古老而又出色的书“Elements of Programming Style”说明:
一位聪明的程序员曾经说过,“浮点数就像一堆沙子;每次移动一个,你都会失去一点沙子并获得一点污垢。”
该部门的整体操作略少,这意味着失去沙子并获得污垢的机会略少。
详细的分析可能需要查看系数(a,b,c等)以及x的值 - 当x很大时,什么有用可能在x接近零时效果不好,也不是反之亦然。
答案 1 :(得分:3)
我认为差异很小,除非x**n
有可能溢出或下溢,在这种情况下你应该使用第二个表达式。
这两个表达在两个地方有所不同:
.../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中的小误差是天文数学放大的。