【问题标题】:Floating point arithmetic unstability [closed]浮点算术不稳定[关闭]
【发布时间】:2017-10-11 22:04:34
【问题描述】:

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

如何确定 x 值的范围并为此类问题找到替代表达式? (通过在线研究,我发现您不希望函数本质上“取消”某些值,但这就是我们正在寻找的全部吗?例如,在 f(x) = e^x - 1 中,我们是总是四处寻找 f(x) = 0?)

【问题讨论】:

  • 这个问题写的太宽泛了。你能说得更具体点吗?
  • 您能否提供一个 x 的值范围,其中 f(x) = sqrt(1+x) - sqrt(1-x) 在使用浮点算术进行评估时给出的结果很差?为这些 x 值提供 f(x) 的替代表达式,以便不会发生“取消错误”。
  • @Brainpower2049:小x 有问题。例如,f(1e-16) 给出1.1102230246251565e-16,而f(1e-17) 给出0.0。在数学上但在数值上不等价的表达式是2*x / (sqrt(1+x) + sqrt(1-x))。这在整个域 [-1.0, 1.0] 上给出了很好的数值结果。
  • 请注意,在双精度中,1.0+1e-17 == 1.0 -1e-17 == 1.0
  • 1+x1-x 将下降到 1x 由于有限的数字表示低于某个值,破坏你的微积分。知道x 有问题的范围,我会选择泰勒级数。在你的情况下,x=0 就像 this question。请注意,当成员对结果没有影响时,您会停止添加成员,即没有达到更高的精度。

标签: math floating-point computer-science precision


【解决方案1】:

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

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

【讨论】:

  • 我认为 herbie 需要更复杂(或更少错误)才能有用。输入 OP 的表达式给了我1/8 x^3/ + (7/128 x^5 + x),没有任何迹象表明这个表达式可能在哪个领域有用。
  • 这很奇怪:我刚刚试用了这个小网络应用程序,它给出了您在问题中建议的答案:(x+x) / (sqrt(1+x) + sqrt(1-x))
  • 嗯,这奇怪。我仍然得到与以前相同的结果(泰勒级数展开约为 0)。不过,看起来算法有一些随机输入;也许这可以解释它。
猜你喜欢
  • 2018-07-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多