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

标签 c++ c math precision sqrt

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/

相关文章:

C++ 如何忽略头文件中定义的方法?

c++ - 音频线程

c - 动态大小字符数组中的运行时错误

c - 如何在函数体内引用与局部变量同名的全局变量?

c - 缩放互补误差函数的精确计算,erfcx()

python - Python 和 Excel 中 TAN(X) 的错误值

objective-c - Sin 和 Cos 函数返回不正确的结果

c++ - 运算符 '...' 具有覆盖说明符但不覆盖基类成员

c++ - 根据范围(类、方法、全局...)的变量命名约定

C. 打印出来的不对,目前还没搞清楚原因