计算 1 - sqrt(x) 用于小参数 x (~10^-12),类似于 expm1(在 C/C++ 中)

Computing 1 - sqrt(x) for small argument x (~10^-12) similar to expm1 (in C/C++)

本文关键字:expm1 类似于 C++ sqrt 用于 计算 参数      更新时间:2023-10-16

我读到expm1函数适用于计算小x的1 - exp(x),而不会因在~15位数字(对于双精度)处截断1.0而失去精度。1 - sqrt(x) 有这样的函数吗?目前,我只是使用非常大的泰勒展开,因为我需要与双精度/长双精度一样多(最好是所有)精度。

编辑:我在这里严重混淆了我的意图:我希望在 10^-12 和 1 之间的任何地方计算x1 - sqrt(1-x)

这里的问题似乎动机很差。虽然 exp(x) 收敛到 1 当 x 变为 0 时,这意味着给定相同的浮点精度 exp(x)-1 对于小 x 具有比 exp(x) 更多的有效数字,对于 sqrt(x) 则不正确,当 x 变为 0 时,sqrt(x) 收敛到 0。换句话说,对于小x,exp(x)-1可以比exp(x)精确一些,但对于1-sqrt(x)来说并非如此 - 这实际上会变得更糟,因为你把它从接近0(1e-6)的东西带到接近1(0.999999)。

另一方面,如果你想为非常小的 x 计算 sqrt(1+x)(作为非常接近 x=1 的 sqrt(x) 的精确测量),sqrt(1+x)-1 将是一个更准确的浮点计算。它的泰勒系列会很好地工作;我发现 |x|<1e-9, x/2 - x^2/8 + x^3/16 是 sqrt(1+x)-1 在 RMS 分数误差 3e-29 内的良好近似值(边缘最大为 8e-29) -- 位数是双精度位数的两倍。即使是二次近似也可能足够好(精度约为 20 位)

expm1函数适用于计算 1 - exp(x)。

正如在参考中读到的:

对于 x 的小量级值,expm1可能比exp(x)-1更准确。


1 - sqrt(x) 有这样的函数吗?

不,至少不在标准标头中。