计算 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
函数适用于计算小x的1 - exp(x),而不会因在~15位数字(对于双精度)处截断1.0而失去精度。1 - sqrt(x) 有这样的函数吗?目前,我只是使用非常大的泰勒展开,因为我需要与双精度/长双精度一样多(最好是所有)精度。
编辑:我在这里严重混淆了我的意图:我希望在 10^-12 和 1 之间的任何地方计算x
1 - 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) 有这样的函数吗?
不,至少不在标准标头中。
- 类似于strcat()的函数出现问题
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 算术运算的结果类似于:C浮点变量中的1/3
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 创建类似于布尔值的变量类型
- 如何在 Arduino 字符串的开头添加元素.类似于 JS unshift();
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 如何创建类似于 QVariant 的变体类
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- C++中用于结构的纯数组的类似于TableView/DataFrame的通用功能
- 有没有类似于stoi的函数可以用于模板类
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 序列化模式类似于boost::序列化
- 构造一个类似于JSON文件c++的字符串
- 多重继承中的派生类的行为类似于聚合
- 如何使更安全的C++变体访问者,类似于切换语句?
- C++ Python 中是否有类似于 help() 的函数
- 计算 1 - sqrt(x) 用于小参数 x (~10^-12),类似于 expm1(在 C/C++ 中)