我知道你可以使用:
#define _USE_MATH_DEFINES
然后:
M_PI
如何获得常数 pi,但如果我没记错的话(欢迎评论),这取决于编译器/平台。那么,在将其从 Linux 移植到其他系统时,最可靠的使用 pi 常数的方法是什么?
我知道我可以定义一个浮点数/双精度浮点数,然后将其设置为四舍五入的 pi 值,但我真的想知道是否有指定的机制。
Meeting C++有一篇关于生成圆周率的不同选项的文章: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; }
#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:
#include <numbers>
#include <iostream>
int main() {
std::cout<< std::numbers::pi_v<double> <<"\n";
}
_v
部分是否与 is_same_v
中的 _v
相同,其他可能意味着“值”? - Ayxan Haqverdili#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;
}
atan(1.0)*4.0
。 - Nicu Stiurca