Algorithm 多项式求值精度,乘法与除法
假设x中有多项式,除以x的幂:Algorithm 多项式求值精度,乘法与除法,algorithm,floating-accuracy,numerical-analysis,Algorithm,Floating Accuracy,Numerical Analysis,假设x中有多项式,除以x的幂: p = (a + x(b + x(c + ..)))/(x**n) 撇开效率不谈,更精确的数值计算方法是上述方法还是使用除法: p = (((a/x + b)/x + c)/x + ...) 从理论上说,如果这些值是以“无限”精度精确计算的,那么应该不会有任何差异 Kernighan和Plauger在他们古老但优秀的书中指出: 一位聪明的程序员曾经说过,浮点数就像一小堆沙子;每次你移动一个,你就会失去一点沙子,得到一点泥土 该部门的业务总体上略为减少,这意味着
p = (a + x(b + x(c + ..)))/(x**n)
撇开效率不谈,更精确的数值计算方法是上述方法还是使用除法:
p = (((a/x + b)/x + c)/x + ...)
从理论上说,如果这些值是以“无限”精度精确计算的,那么应该不会有任何差异 Kernighan和Plauger在他们古老但优秀的书中指出: 一位聪明的程序员曾经说过,浮点数就像一小堆沙子;每次你移动一个,你就会失去一点沙子,得到一点泥土 该部门的业务总体上略为减少,这意味着流失沙子和获得灰尘的机会略为减少
详细的分析可能需要查看系数A、b、c等以及x的值——当x很大时起作用的可能在x接近零时不起作用,反之亦然。理论上,如果以“无限”精度准确计算值,则不应该有任何差异 Kernighan和Plauger在他们古老但优秀的书中指出: 一位聪明的程序员曾经说过,浮点数就像一小堆沙子;每次你移动一个,你就会失去一点沙子,得到一点泥土 该部门的业务总体上略为减少,这意味着流失沙子和获得灰尘的机会略为减少
详细的分析可能需要查看系数A、b、c等,也许还需要查看x的值——当x很大时起作用的可能在x接近零时不起作用,反之亦然。我认为差异是最小的,除非有可能x**n溢出或下溢,在这种情况下,应该使用第二个表达式 这两个表达式在两个地方有所不同: 第一个表达式的求值顺序是颠倒的…,c,b,a和a,b,c。。。对于第二个表达式。哪一个最好取决于系数的值。 第一个表达式的结尾是…/x**n。正如Jonathan解释的那样,出于这个原因,第二个表达式可能更准确,因为它的运算量更少。但是,我认为…/x**n与其他地方相比,只会造成最小的精度损失,除非x**n溢出或下溢。
我认为差异是最小的,除非有可能x**n溢出或下溢,在这种情况下,您应该使用第二个表达式 这两个表达式在两个地方有所不同: 第一个表达式的求值顺序是颠倒的…,c,b,a和a,b,c。。。对于第二个表达式。哪一个最好取决于系数的值。 第一个表达式的结尾是…/x**n。正如Jonathan解释的那样,出于这个原因,第二个表达式可能更准确,因为它的运算量更少。但是,我认为…/x**n与其他地方相比,只会造成最小的精度损失,除非x**n溢出或下溢。
不幸的是,提供的答案是错误的 第二个方程p=a/x+b/x+c/x+。。。只差一点点 对于准确度和速度来说要差得多 为什么??乘法的相对误差只有主要的线性项 和一个小的二次项。相比之下,除法引入了更高的成本,但 非常小的三次、四次项: e=相对误差,假设两项均为常数 a*b=a1+eb1+e=ab 1+2e+e^2//乘法 a/b=a1+e/b1+e=a/b1+e1+e+e^2+e^3+…几何级数//除法 所以除法总是比乘法差一点。 出于速度考虑:除法总是比乘法慢, 法向系数可以在3-10倍之间变化。所以嵌套的划分非常重要 如果不计算最后一个因子,则比嵌套乘法慢 x^n不是通过pow,而是通过嵌套乘法 x^n可以通过循环乘以结果来轻松计算 双倍功率=x; 对于n-1 功率*=x 如果您使用pow,请注意它主要由 指数和对数,所需时间比必要的100倍多得多 您是否意识到,虽然加倍和精确结果之间的误差仍然很小, 对于更高的n,多项式结果对x的变化非常敏感?! 因此,如果你使用更高的n,请注意你的答案可能完全不正确
因为x中的小误差在天文上被放大了。不幸的是,提供的答案是错误的 第二个方程p=a/x+b/x+c/x+。。。只差一点点 对于准确度和速度来说要差得多 为什么??乘法的相对误差只有主要的线性项 和一个小的二次项。相比之下,除法引入了更高的成本,但 非常小的三次、四次项: e=相对误差,假设两项均为常数 a*b=a1+eb1+e=ab 1+2e+e^2//乘法 a/b=a1+e/b1+e=a/b1+e1+e+e^2+e^3+…几何级数//除法 所以除法总是比乘法差一点。 出于速度考虑:除法总是比乘法慢, 法向系数可以在3-10倍之间变化。所以嵌套的划分非常重要 如果不计算最后一个因子,则比嵌套乘法慢 x^n不是通过pow,而是通过嵌套乘法 x^n可以通过循环乘以结果来轻松计算 双倍功率=x; 对于n-1 功率*=x 如果您使用pow,请注意它主要由 指数和对数,所需时间比必要的100倍多得多 您是否意识到,虽然加倍和精确结果之间的误差仍然很小, 对于更高的n,多项式结果对x的变化非常敏感?! 因此,如果你使用更高的n,请注意你的答案可能完全不正确
因为x中的小误差在天文上被放大。一致同意的加减法是导致精度损失的真正罪魁祸首,这里没有任何真正的区别。一致同意的加减法是导致精度损失的真正罪魁祸首,这里没有任何真正的区别。