constexpr 替换数学常量,如 M_PI

Posted

技术标签:

【中文标题】constexpr 替换数学常量,如 M_PI【英文标题】:constexpr replacements for math constants like M_PI 【发布时间】:2013-03-22 19:36:02 【问题描述】:

是否有任何 C++11 constexpr 常量可以用来代替 <cmath> 中的常量宏,即像 M_PI 和朋友这样的常量?或者缺少在运行时提供这些常量的任何全局const 值?

【问题讨论】:

constexpr 有什么好处?宏是常量表达式,不是吗? @Pubby:constexpr 与宏:主要好处是干净的命名空间处理,以及像this one 这样的问题可能不太可能发生。 constexpr 与简单的const:可以确保在编译时使用它们,例如计算模板参数。 【参考方案1】:

C++ 标准库中没有定义预定义的 constexpr 或全局 const 常量。但是您可以自己定义它们,例如:

namespace MathConstants 
    const double E =            2.71828182845904523536;
    const double LOG2E =        1.44269504088896340736;
    const double LOG10E =       0.434294481903251827651;
    const double LN2 =          0.693147180559945309417;
    const double LN10 =         2.30258509299404568402;
    const double PI =           3.14159265358979323846;
    const double PI_2 =         1.57079632679489661923;
    const double PI_4 =         0.785398163397448309616;
    const double PI_1_PI =      0.318309886183790671538;
    const double PI_2_PI =      0.636619772367581343076;
    const double PI_2_SQRTPI =  1.12837916709551257390;
    const double SQRT2 =        1.41421356237309504880;
    const double SQRT1_2 =      0.707106781186547524401;
;

或者使用boost数学常量模板,一些文档here(没用过)。

【讨论】:

+1 用于提升指针。似乎在最近的版本中,这些东西已经从 internals 子包中移出,所以它的 API 应该是相当稳定的。见recent documentation。

以上是关于constexpr 替换数学常量,如 M_PI的主要内容,如果未能解决你的问题,请参考以下文章

constexpr:确定性的常量优化

请解释 constexpr [重复]

当值是非常量但使用常量表达式初始化时使用 constexpr?

constexpr和字面值常量类

[C++11]constexpr修饰常量表达式

常量表达式 & constexpr