最大限度地减少重复操作导致的舍入错误的影响

时间:2010-09-14 14:39:37

标签: algorithm floating-point rounding-error

我刚刚遇到Kahan (or compensated) summation algorithm for minimizing roundoff,我想知道是否有等效的除法和/或乘法算法,以及减法(如果恰好有一个,我知道关联性)。任何语言,伪代码或链接的实现示例都会很棒!

由于

3 个答案:

答案 0 :(得分:6)

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

对于乘法,有一些算法可以将两个浮点数的乘积转换为两个浮点数的总和而不进行舍入,此时你可以使用Kahan求和或其他方法,具体取决于你需要什么做下一个产品。

如果您有FMA(融合乘法 - 加法)可用,这可以很容易地完成如下:

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

在这两个操作之后,如果没有发生上溢或下溢,p + r完全等于a * b而没有舍入。这也可以在没有FMA的情况下完成,但是更加困难。如果您对这些算法感兴趣,可以先下载crlibm documentation,其中详细介绍了其中几个算法。

分部......好吧,最好避免分工。分工很慢,补偿分工甚至更慢。你可以做到这一点,但如果没有FMA,它就会非常难以实现,并且非常重要。最好设计你的算法以尽可能避免它。

请注意,所有这些都很快就会成为一场失败的战斗。有一些非常狭窄的情况,这些技巧是有益的 - 对于任何更复杂的情况,使用像mpfr这样的更精确的浮点库更好。除非你是该领域的专家(或想成为一名专家),否则通常最好只学会使用这样的库。

答案 1 :(得分:2)

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

诊断算法稳定性的一种相对简单的方法是使用interval arithmetic

答案 2 :(得分:0)

您可以使用bignums和有理分数而不是浮点数,在这种情况下,您仅受限于内存的有限可用性以保持需求精度。