我read expm1
函数适用于为小 x 计算 1 - exp(x),而不会因截断 1.0 ~15 位数字( double )而损失精度。 1 - sqrt(x) 有这样的函数吗?目前我只是在使用非常大的泰勒展开式,因为我需要尽可能多(最好是所有)的精度数字,因为 double /长 double 可以提供。
编辑:我在这里严重混淆了我的意图:我正在寻找计算 1 - sqrt(1-x)
for x
10^-12 和 1 之间的任何地方。
最佳答案
这里的问题似乎动机不纯。当 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 在边缘)—— double 字的两倍。即使是二次近似也可能足够好(大约有 20 位精度)
关于c++ - 计算 1 - 小参数 x (~10^-12) 的 sqrt(x) 类似于 expm1(在 C/C++ 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44661725/