【发布时间】:2018-11-01 19:54:35
【问题描述】:
我想以可移植的方式使用标准<cmath> 函数的constexpr 版本,例如exp、log、pow。我目前有一个不可移植的解决方案g++ treats these functions as constexpr - a non-compliant extension of C++,但我担心可移植性和面向未来(我想有一天这个扩展可能会从g++ 中删除)。
我对这些函数的constexpr 版本感兴趣,而不是模板元程序——我希望在编译时和运行时都可以使用相同的功能。我不需要 C 兼容性,但我确实需要快速实现 - 诸如泰勒级数展开之类的幼稚实现太慢了。
如何实现这些功能?我对@987654334@、log和pow特别感兴趣
我从研究中学到的一些相关的东西
- 这些函数的标准兼容版本在技术上不是
constexpr,因为它们必须具有副作用(例如设置errno)以保持 C 兼容性 - 在 C++11 中,允许实现使这些函数
constexpr,但在 C++14 中,这是禁止的(根据 the first answer to this question 和 the answer to this question)。这是我担心在g++的未来版本中这些功能可能不是constexpr的部分原因 -
g++对每个数学函数foo的实现只是调用了一个内置函数__builtin_foo,它被视为constexpr。我也许可以开始调用__builtin_foo函数而不是foo函数——即使相应的foo函数符合要求,这些函数在g++的未来版本中可能仍然是constexpr——但这只会有助于未来——打样,而不是便携性。
【问题讨论】:
-
我的问题更具体——我想要 constexpr 实现,因为我想要在编译时和运行时都具有完全相同的功能。链接问题的公认答案是一个模板元程序,在这里不起作用。
-
“我希望在编译时和运行时都可以使用相同的功能。” - 运行时和编译时函数需要同名吗?如果有,为什么?
-
@DavisHerring 对于内置运算符
+-*/也是如此,但标准允许将它们评估为constexpr -
@user1476176:是的:那个问题(以及要创建
constexpr的函数)是under discussion。 -
您实现 constexpr
exp的方式与实现非 constexprexp的方式相同,或者可能采用更复杂的方式。如何在 C++ 中实现快速可移植精确exp?这不是一个可能有单一简明权威答案的问题。太宽泛了!
标签: c++ c++11 language-lawyer constexpr