Я знаю, что вы можете использовать:
#define _USE_MATH_DEFINES
а потом:
M_PI
чтобы получить постоянную пи. Однако, если я правильно помню (комментарии приветствуются), это зависит от компилятора / платформы. Итак, какой самый надежный способ использовать константу pi, которая не вызовет никаких проблем при переносе ее с Linux на другие системы?
Я знаю, что я мог бы просто определить число с плавающей запятой / double, а затем установить для него округленное значение числа пи, но мне бы очень хотелось узнать, есть ли назначенный механизм.
Встреча C ++ есть статья о различных вариантах генерации пи: C ++ & π они обсуждают некоторые варианты, от CMATH, который не зависит от платформы:
double pi = M_PI;
std::cout << pi << std::endl;
и из увеличение:
std::cout << boost::math::constants::pi<double>() << std::endl
и используя загар, с 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;
}
Приведенная ниже функция вычисляет число Пи, не полагаясь ни на какие библиотеки.
Кроме того, тип его результата является параметром шаблона.
Независимость от платформы немного подавлена, потому что она работает только с дробными типами с фиксированной точностью — вычисленное значение должно сходиться и оставаться постоянным в течение 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;
}