Лучшая платформа независимая постоянная пи?

Я знаю, что вы можете использовать:

#define _USE_MATH_DEFINES

а потом:

M_PI

чтобы получить постоянную пи. Однако, если я правильно помню (комментарии приветствуются), это зависит от компилятора / платформы. Итак, какой самый надежный способ использовать константу pi, которая не вызовет никаких проблем при переносе ее с Linux на другие системы?

Я знаю, что я мог бы просто определить число с плавающей запятой / double, а затем установить для него округленное значение числа пи, но мне бы очень хотелось узнать, есть ли назначенный механизм.

11

Решение

Встреча 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;
}
11

Другие решения

Приведенная ниже функция вычисляет число Пи, не полагаясь ни на какие библиотеки.

Кроме того, тип его результата является параметром шаблона.

Независимость от платформы немного подавлена, потому что она работает только с дробными типами с фиксированной точностью — вычисленное значение должно сходиться и оставаться постоянным в течение 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;
}
3

По вопросам рекламы [email protected]