我知道你可以使用:
#define _USE_MATH_DEFINES
然后:
M_PI
获得常数pi。但是,如果我没记错的话(欢迎评论)这是依赖于编译器/平台的。那么,当我将它从Linux移植到其他系统时,使用pi常量最可靠的方法是什么呢?
我知道我可以定义一个float / double然后自己将它设置为舍入的pi值,但我真的想知道是否有指定的机制。
答案 0 :(得分:12)
Meeting C++有一篇关于生成pi的不同选项的文章:C++ & π他们讨论了cmath的一些选项,它们不是独立于平台的:
double pi = M_PI;
std::cout << pi << std::endl;
和boost:
std::cout << boost::math::constants::pi<double>() << std::endl
并使用atan,删除 constexpr ,因为SchighSchagh指出这不是与平台无关的:
double const_pi() { return std::atan(1)*4; }
我将所有方法收集到live example:
#include <iostream>
#include <cmath>
#include <boost/math/constants/constants.hpp>
double piFunc() { return std::atan(1)*4; }
int main()
{
double pi = M_PI;
std::cout << pi << std::endl;
std::cout << boost::math::constants::pi<double>() << std::endl ;
std::cout << piFunc() << std::endl;
}
答案 1 :(得分:3)
下面的函数计算pi而不依赖任何库。
此外,其结果的类型是模板参数。
平台ueber-independent被扼杀了一点,因为它只适用于固定精度小数类型 - 计算值需要收敛并在2次迭代中保持不变。
因此,如果指定某种任意精度的有理或浮点类,它将根据需要自动增加其精度,对此函数的调用将不会很好地结束。
#include <iostream>
#include <iomanip>
namespace golf {
template <typename T> inline T calc_pi() {
T sum=T(0), k8=T(0), fac=T(1);
for(;;) {
const T next =
sum + fac*(T(4)/(k8+T(1))-T(2)/(k8+T(4))-T(1)/(k8+T(5))-T(1)/(k8+T(6)));
if(sum == next) return sum;
sum=next;
fac /= T(16);
k8 += T(8);
} }
static const auto PI = calc_pi<double>();
}
int main() {
std::cout << std::setprecision(16) << golf::PI << std::endl;
return 0;
}