constexpr exp,log,pow

use*_*176 18 c++ language-lawyer constexpr c++11

我想使用constexpr的标准版<cmath>一样的功能exp,log,pow在便携方式.我目前有一个非便携式解决方案g++将这些功能视为constexpr- 不兼容C++的扩展,但我担心可移植性和面向未来(我想这个扩展可能有一天会被删除g++).

constexpr对这些函数的版本感兴趣,而不是模板元程序 - 我希望在编译时和运行时都可以使用相同的功能.我不需要C兼容性,但我确实需要快速实现 - 诸如Taylor Series扩展之类的天真实现会太慢.

我该如何实现这些功能?我在特别感兴趣exp,logpow

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

  • 这些功能的标准兼容版本在技术上并不是constexpr因为它们必须具有副作用(例如设置errno)以保持C兼容性
  • 在C++ 11,一种实现被允许进行这些功能constexpr,但作为C++ 14,这是禁止的(每个第一回答这个问题回答这个问题).这是我担心函数可能不会出现constexpr在以后版本中的部分原因g++
  • g++每个数学函数的实现foo只调用一个内置函数__builtin_foo,它被视为constexpr.我或许可以开始调用__builtin_foo函数而不是foo函数 - 即使相应的函数符合要求,这些函数仍可能保留constexpr在未来版本中- 但这只会有助于未来验证,而不是可移植性.g++foo

yum*_*odo 12

你看过Sprout的实现吗?

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

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

  • 有时我认为我很聪明,是一个不错的程序员。然后我看到像萌芽这样的东西,我完全谦卑了。 (9认同)

Bul*_*aza 5

查看gcem哪个提供了编译时数学函数。它们可以像 中的那样调用std,但使用gcem前缀。