浮点算术不稳定

时间:2017-10-11 22:04:34

标签: math floating-point computer-science precision

对于像f(x)= sqrt(1 + x) - sqrt(1-x)这样的函数,我们会得到一定范围的x值的不需要的结果。但是,我们可以分段重写方程,在某些情况下使用原始方程,在其他情况下使用新方程。

如何计算x值的范围并找到这些问题的替代表达式? (通过在线研究,我发现你根本不希望功能基本上"取消"对于某些值,但是我们正在寻找的是什么?例如,在f(x)中= e ^ x - 1,我们总是只是四处寻找f(x)= 0?)

1 个答案:

答案 0 :(得分:3)

不幸的是,这里没有任何金色的子弹:通常的方法是进行大量的实验和挑剔的错误分析。一些有用的工具:

  • 任意精度算术库(如MPFR),使用更高精度计算表达式,并将结果与​​正常精度进行比较。我喜欢使用Julia,因为它提供了一个支持泛型数学运算符和函数的BigFloat类型。
  • 区间运算:提供错误的保证边界(因此不稳定的计算会爆炸)。我个人经历的唯一方法是ValidatedNumerics.jl(请参阅examples)。
  • herbie使用一些花哨的技巧来自动重写数字表达式以使其更稳定。我没有个人经验,但看起来很酷。 (巧合的是,他们在主页上的例子非常接近你的)