【发布时间】:2015-09-07 19:13:57
【问题描述】:
对于完整的参数范围 x,a >= 0,是否有一种优雅的数值稳定评估以下表达式的方法?
f(x,a) = sqrt(x+a) - sqrt(x)
还有任何编程语言或库可以提供这种功能吗?如果是,以什么名字命名?我现在使用上面的表达式没有什么具体问题,但是以前遇到过很多次,一直以为这个问题之前一定已经解决了!
【问题讨论】:
-
一些库,尤其是 Boost,提供了一个函数
sqrt1pm1(),旨在准确计算 sqrt(x+1)-1。如果您已经使用了这样的库,则可以使用该函数以数值稳健的方式将sqrt(x+a)-sqrt(x)实现为sqrt1pm1 (a/x) * sqrt (x)。 -
@njuffa:啊,很有趣。虽然
log1p和expm1之类的功能很常见,但我之前从未遇到过sqrt1pm1。一方面,当它很容易模拟时,为此创建一个单独的函数似乎很奇怪。另一方面,如果它在 C 标准库中可用,我肯定会找到使用它的机会。 -
@MarkDickinson 正如 Kahan 所展示的,
log1p和expm1也很容易模仿。据推测,在库中提供此类函数的目的是为对数值分析不是特别了解的程序员提供最快和最准确的实现。 -
@njuffa:我想说这是“简单”的一个完全不同的价值。 :-) 例如,请参阅Python source,了解在不能依赖浮点格式和当前舍入模式的情况下尝试模拟
log1p所涉及的注意事项。 -
@njuffa:了解 sqrtpm1 函数很有趣。这其实是我想学的...这种方法的缺点当然是必须添加 x=0 的特殊情况...
标签: math floating-point numeric