c++ - constexpr exp、log、pow

标签 c++ c++11 language-lawyer constexpr

我想使用 constexpr标准版本 <cmath>函数如 exp , log , pow以便携的方式。我目前有一个非可移植解决方案 g++ treats these functions as constexpr - a non-compliant extension of C++ ,但我担心可移植性和面向 future 的能力(我想有一天这个扩展可能会从 g++ 中删除)。

我对 constexpr 感兴趣这些功能的版本,而不是模板元程序 - 我希望在编译时和运行时都可以使用相同的功能。我不需要 C 兼容性,但我确实需要快速实现 - 诸如泰勒级数展开之类的幼稚实现太慢了。

如何实现这些功能?我对 exp 特别感兴趣, log , 和 pow

我从研究中学到的一些相关的东西

  • 这些函数的标准兼容版本在技术上不是 constexpr因为它们必须有副作用(例如设置 errno )才能保持 C 兼容性
  • 在 C++11 中,允许实现这些函数 constexpr ,但从 C++14 开始,这是被禁止的(根据 the first answer to this questionthe answer to this question )。这是我担心函数可能不是 constexpr 的部分原因。在 g++ 的 future 版本中
  • g++的每个数学函数的实现foo只调用一个内置函数__builtin_foo , 被视为 constexpr .我也许可以开始调用 __builtin_foo函数而不是 foo功能 - 这些可能会保留 constexprg++ 的 future 版本中即使对应的foo功能符合要求 - 但这仅有助于面向 future ,而不是可移植性。

最佳答案

你看过Sprout的实现?

Sprout 是仅包含 header 的库,提供基于 C++11/14 constexpr 的容器、算法、随机数、解析、光线追踪、合成器等。

https://github.com/bolero-MURAKAMI/Sprout/tree/master/sprout/math

关于c++ - constexpr exp、log、pow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50477974/

相关文章:

c++ - [dcl.fct.default]/10 中存在明显矛盾

javascript - 使用 cocos2d-js 设置 jsbindings 类的正确方法是什么?

c++ - 计算机图形学中的最大凸面修补

c++ - 可变参数模板

c++ - 原子变量是无锁的吗?

c++ - 在模板函数中使用 auto 和 decltype

c++ - 为什么 C 编译器会丢弃我的 &0xFF 掩码?

C++11 引入了标准化的内存模型。这是什么意思?它将如何影响 C++ 编程?

c - (int *)0是空指针吗?

c++ - [expr.ref]/2 中的左值到右值转换