我知道你可以用:
#define _USE_MATH_DEFINES然后:
M_PI得到常数π。但是,如果我正确地记住(欢迎注释),这是编译器/平台依赖的。那么,当我将pi常量从Linux移植到其他系统时,最可靠的使用方法是什么呢?
我知道我可以定义一个float/double,然后自己将它设置为一个圆形pi值,但是我非常想知道是否有一个指定的机制。
发布于 2014-02-18 23:22:00
会见C++有一篇关于生成pi:C++和π的不同选项的文章--他们讨论了来自卡马奇的一些选项,后者不是独立于平台的:
double pi = M_PI;
std::cout << pi << std::endl;来自助推
std::cout << boost::math::constants::pi<double>() << std::endl并且使用阿坦,从SchighSchagh指出这并不是独立于平台的那一刻起就移除了removed:
double const_pi() { return std::atan(1)*4; }我将所有的方法聚集到一个实例化中。
#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;
}C++2a pi_v
在C++2a中,我们应该得到V
#include <numbers>
#include <iostream>
int main() {
std::cout<< std::numbers::pi_v<double> <<"\n";
}发布于 2014-02-19 01:39:32
下面的函数计算pi时完全不依赖任何库。
而且,其结果的类型是一个模板参数。
Platform ueber独立性受到了一点抑制,因为它只适用于固定精度的小数类型--计算值需要在2次迭代中收敛并保持不变。
因此,如果您指定了某种任意精度的rational或浮点类,它将根据需要自动提高其精度,那么对该函数的调用就不会很好地结束。
#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;
}https://stackoverflow.com/questions/21867617
复制相似问题