计算 1 - 小参数 x (~10^-12) 的 sqrt(x) 类似于 expm1(在 C/C++ 中)
Computing 1 - sqrt(x) for small argument x (~10^-12) similar to expm1 (in C/C++)
我 read expm1
函数适用于计算小 x 的 1 - exp(x),不会因截断 1.0 ~15 位数字(双精度)而失去精度。 1 - sqrt(x) 有这样的函数吗?目前我只是使用非常大的泰勒展开,因为我需要尽可能多的(最好是所有)精度数字 doubles/long 双打可以提供。
编辑:我在这里严重混淆了我的意图:我正在寻找计算 1 - sqrt(1-x)
for x
在 10^-12 和 1 之间的任何地方。
the expm1
function is suited for computing 1 - exp(x).
可以在 ref 中阅读:
For small magnitude values of x, expm1
may be more accurate than exp(x)-1
.
Is there such a function for 1 - sqrt(x)?
没有,至少在标准中没有headers。
这里的问题似乎动机不纯。当 x 变为 0 时 exp(x) 收敛到 1,这意味着给定相同的浮点精度,对于小 x,exp(x)-1 比 exp(x) 具有更多有效数字,但对于 sqrt(x) 则不然,当 x 变为 0 时收敛到 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 在 3e-29 的 RMS 小数误差范围内的良好近似值(最大值为8e-29 在边缘)——双精度数的两倍。即使是二次近似也可能足够好(精度大约为 20 位数)
我 read expm1
函数适用于计算小 x 的 1 - exp(x),不会因截断 1.0 ~15 位数字(双精度)而失去精度。 1 - sqrt(x) 有这样的函数吗?目前我只是使用非常大的泰勒展开,因为我需要尽可能多的(最好是所有)精度数字 doubles/long 双打可以提供。
编辑:我在这里严重混淆了我的意图:我正在寻找计算 1 - sqrt(1-x)
for x
在 10^-12 和 1 之间的任何地方。
the
expm1
function is suited for computing 1 - exp(x).
可以在 ref 中阅读:
For small magnitude values of x,
expm1
may be more accurate thanexp(x)-1
.
Is there such a function for 1 - sqrt(x)?
没有,至少在标准中没有headers。
这里的问题似乎动机不纯。当 x 变为 0 时 exp(x) 收敛到 1,这意味着给定相同的浮点精度,对于小 x,exp(x)-1 比 exp(x) 具有更多有效数字,但对于 sqrt(x) 则不然,当 x 变为 0 时收敛到 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 在 3e-29 的 RMS 小数误差范围内的良好近似值(最大值为8e-29 在边缘)——双精度数的两倍。即使是二次近似也可能足够好(精度大约为 20 位数)