代码之家  ›  专栏  ›  技术社区  ›  Geoff

有效地减少重复操作引起的舍入误差的影响

  •  7
  • Geoff  · 技术社区  · 16 年前

    我最近才遇到 Kahan (or compensated) summation algorithm for minimizing roundoff

    谢谢

    3 回复  |  直到 16 年前
        1
  •  7
  •   Stephen Canon    16 年前

    减法通常通过Kahan方法处理。

    对于乘法,有一些算法可以将两个浮点数的乘积转换为两个浮点数的和,而无需舍入,此时可以使用Kahan求和或其他方法,具体取决于下一步需要对乘积执行的操作。

    p = a*b;
    r = fma(a,b,-p);
    

    在这两次操作之后,如果没有发生溢流或下溢, p + r 完全等于 a * b 没有四舍五入。这也可以在没有FMA的情况下完成,但难度更大。如果您对这些算法感兴趣,可以从下载 crlibm documentation

    请注意,所有这一切很快就会成为一场失败的战斗。有一个非常狭窄的范围内的情况下,这些技巧是有益的-对于任何更复杂的,它是更好的只是使用一个更广泛的精度浮点库,如 mpfr . 除非你是这一领域的专家(或者想成为专家),否则通常最好只是学会使用这样的库。

        2
  •  2
  •   Michael Borgwardt    16 年前

    numerically stable 它本身就是一门学科和研究领域。这不是你可以通过“备忘单”有意义地做(或学)的事情——它需要特定的数学知识,需要针对每个特定的算法来做。如果你想学习如何做到这一点,维基百科文章中的参考资料听起来相当不错:Nicholas J.Higham,数值算法的准确性和稳定性,工业和应用数学学会,费城,1996年。书号0-89871-355-2。

    诊断 interval arithmetic .

        3
  •  0
  •   John    16 年前

    您可以使用bignums和有理分数,而不是浮点数,在这种情况下,只有有限的内存可用性才能满足精度要求。