2013-03-22 65 views
4

是否有任何C++ 11 constexpr常量可用來代替<cmath>中的常量宏,即常量如M_PI和朋友?或缺乏,在運行時提供這些常量的任何全局const值?constexpr替代數學常量,如M_PI

+0

'constexpr'會帶來什麼好處?宏是常量表達式,不是嗎? – Pubby 2013-03-22 19:37:42

+0

@Pubby:'constexpr'與宏:主要好處是乾淨的命名空間處理,並且像[this one](http://stackoverflow.com/q/6563810/1468366)這樣的問題可能不太可能。 'constexpr'與簡單的'const':可以確定在編譯時使用它們。計算模板參數。 – MvG 2013-03-22 19:41:59

回答

5

沒有在C++標準庫中定義的預定義的constexpr或全局常量常量。但是你可以通過自己喜歡定義它們,例如:

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; 
}; 

或者使用升壓數學常數模板,一些文檔here(沒有用它)。

+1

+1爲boost指針。似乎在最近的版本中,這些東西已經被移出內部子包,所以它的API應該是相當穩定的。請參閱[最近文檔](http://www.boost.org/doc/libs/1_53_0/libs/math/doc/sf_and_dist/html/math_toolkit/constants.html)。 – MvG 2013-03-23 01:30:21