Math 浮点运算不稳定性
对于像f(x)=sqrt(1+x)-sqrt(1-x)这样的函数,我们会在一定的x值范围内得到不需要的结果。然而,我们可以分段重写方程,在某些情况下使用原始方程,在其他情况下使用新方程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
我该如何计算x值的范围,并为类似的问题找到一个替代表达式?(通过在线研究,我发现你不希望函数本质上“抵消”某些值,但这就是我们所要寻找的吗?例如,在f(x)=e^x-1中,我们总是在寻找f(x)=0吗?不幸的是,这里没有黄金子弹:通常的方法是大量的实验和挑剔的错误分析。一些有用的工具:
- 任意精度的算术库,如MPFR,用于使用更高精度计算表达式,并将结果与正常精度进行比较。我喜欢使用Julia,因为它提供了一个支持通用数学运算符和函数的
类型BigFloat
- 区间算法:提供错误的保证范围(因此不稳定的计算将爆发)。我个人体验过的唯一软件包是(参见)
- 使用一些奇特的技巧自动重写数值表达式以使其更稳定。我没有亲身体验过,但它看起来确实很酷。(巧合的是,他们主页上的示例与您的非常接近)
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.01+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)。不过,看起来算法中有一些随机输入;也许这就是原因。