Math 浮点运算不稳定性

Math 浮点运算不稳定性,math,floating-point,computer-science,precision,Math,Floating Point,Computer Science,Precision,对于像f(x)=sqrt(1+x)-sqrt(1-x)这样的函数,我们会在一定的x值范围内得到不需要的结果。然而,我们可以分段重写方程,在某些情况下使用原始方程,在其他情况下使用新方程 我该如何计算x值的范围,并为类似的问题找到一个替代表达式?(通过在线研究,我发现你不希望函数本质上“抵消”某些值,但这就是我们所要寻找的吗?例如,在f(x)=e^x-1中,我们总是在寻找f(x)=0吗?不幸的是,这里没有黄金子弹:通常的方法是大量的实验和挑剔的错误分析。一些有用的工具: 任意精度的算术库,如MP

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


我该如何计算x值的范围,并为类似的问题找到一个替代表达式?(通过在线研究,我发现你不希望函数本质上“抵消”某些值,但这就是我们所要寻找的吗?例如,在f(x)=e^x-1中,我们总是在寻找f(x)=0吗?

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

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

这个问题写得太宽泛了。你能更具体一点吗?你能提供一个x的值范围吗,其中f(x)=sqrt(1+x)-sqrt(1-x)在使用浮点运算进行计算时给出的结果很差?为这些x值提供一个f(x)的替代表达式,以便不会出现“取消错误”。@Brainpower2049:small
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+x
1-x
将降至
1
x
低于某个特定值,从而破坏您的演算。知道
x
有问题的范围,我将使用泰勒级数。在您的例子中,
x=0
类似。请注意,当成员对结果没有影响时,即没有达到更高的精度时,您将停止添加成员。我认为herbie需要更复杂(或更少的bug)才能发挥作用。输入OP的表达式给了我
1/8x^3/+(7/128x^5+x)
,但没有说明这个表达式在哪个领域可能有用。这很奇怪:我刚刚用一个小的web应用程序尝试了它,它给出了你在问题中建议的答案:
(x+x)/(sqrt(1+x)+sqrt(1-x))
,这很奇怪。我仍然得到了和以前一样的结果(泰勒级数展开约为0)。不过,看起来算法中有一些随机输入;也许这就是原因。