我想使用 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 question 和 the answer to this question )。这是我担心函数可能不是constexpr
的部分原因。在g++
的 future 版本中 -
g++
的每个数学函数的实现foo
只调用一个内置函数__builtin_foo
, 被视为constexpr
.我也许可以开始调用__builtin_foo
函数而不是foo
功能 - 这些可能会保留constexpr
在g++
的 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/