Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 多项式求值精度,乘法与除法_Algorithm_Floating Accuracy_Numerical Analysis - Fatal编程技术网

Algorithm 多项式求值精度,乘法与除法

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在他们古老但优秀的书中指出: 一位聪明的程序员曾经说过,浮点数就像一小堆沙子;每次你移动一个,你就会失去一点沙子,得到一点泥土 该部门的业务总体上略为减少,这意味着

假设x中有多项式,除以x的幂:

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中的小误差在天文上被放大。

一致同意的加减法是导致精度损失的真正罪魁祸首,这里没有任何真正的区别。一致同意的加减法是导致精度损失的真正罪魁祸首,这里没有任何真正的区别。