1/sqrt(x) 和 std::exp(-0.5 * std::log(x)) 之间的数值权衡
Numerical trade offs between 1/sqrt(x) and std::exp(-0.5 * std::log(x))
我遇到了一些计算的旧代码
double y = 1 / std::sqrt(x);
用:
constexpr double base16 = 16.0;
double log_base16 = std::log(base16);
double y = std::pow(base16, -0.5 * std::log(x) / log_base16);
这本质上是:
double y = std::exp(-0.5 * std::log(x));
在方法之间的数值优势(例如准确性或更有可能避免下溢/溢出(方面是否有任何理由?原作者可能也是这么认为的。
原始代码确实被认为非常顽皮,特别是在现代C++标准和浮点IEEE754:
std::sqrt 是 IEEE 标准所要求的精确。[原文如此]
此外,std::pow
没有这样的要求。
因此,我很想将其重写为1 / std::sqrt(x)
,当然是测试。
参考: http://en.cppreference.com/w/cpp/numeric/math/sqrt
我看不出有任何特别好的理由在pow((和log((方面实现sqrt((。可能是sqrt((的实现中存在错误,这被用作解决方法。
通常,我希望此实现速度较慢且精度较低。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- std::memmove在同一对象之间是否始终安全
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- std::fabs(a * b) 和 std::fabs(a) * std::fabs(b) 之间的区别
- 如何在窗口之间移动 std::unique_ptr 而不会冒内存泄漏的风险?
- 简单使用 std::atomic 在两个线程之间共享数据
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- "std::function<double(double)>"到"double (*)(double)"之间的转换
- malloc 和 calloc 与 std::string 之间的区别
- std::random_device和std::mt19937_64之间有什么区别
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 我收到void main()和使用命名空间std;之间的冲突;?我正在使用代码块
- iostream和命名空间std之间的关系是什么?