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的主要内容,如果未能解决你的问题,请参考以下文章