Найти Пи к N-й цифре

Я начинаю учить себя C ++, пока мой класс не начнется осенью. Мне было интересно, сможете ли вы помочь мне придумать лучший способ узнать у пользователя количество цифр, которое они хотят для числа пи, а затем отобразить его. Моя проблема в том, что использование pi = atan (1) * 4 не является точным после десяти десятичных знаков. Есть ли лучший встроенный номер, в котором число пи должно быть не менее 20 знаков после запятой? Вот что у меня пока, спасибо!

#include <iostream>
#include <string>
#include <iomanip>
#include <ios>
#include <sstream>
using namespace std;
using std::setprecision;
using std::streamsize;int main()
{
double pi = atan(1)*4;
int input = 0;
while(true)
{
cout << "Please enter how many digits of PI you would like to see (Max 20): ";
cin >> input;
if(input > 0 && input <= 20)
{
break;
}
else
{
cout << "That's not a valid number! Try again." << endl;
}
}
streamsize prec = cout.precision();
cout << setprecision(input);
cout << "Here you go: " << pi <<endl;
system("pause");
}

0

Решение

Самый простой способ сделать это, вероятно, просто иметь std::string содержащие цифры, которые вы хотите ("3.14159265358979323846264338327950288419"), а затем просто напечатайте первый input цифры после запятой.

14

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

Я бы сказал, что это не проблема C ++, а проблема математики. Существует несколько бесконечных рядов, которые очень быстро сходятся к истинному значению числа Пи. Вы смотрели на статья в Википедии на эту тему?

Что касается точности до девяти или десяти цифр, вы можете столкнуться с проблемами округления, используя double (особенно с определенными методами расчета). Я хотел бы рассмотреть в математической библиотеке произвольной точности. Я большой поклонник MPFR, но я уверен, что Boost имеет нечто аналогичное, если это больше подходит вам (имейте в виду, что Boost — это библиотека C ++, тогда как MPFR — это библиотека C [хотя вы, конечно, можете использовать код C из C ++]).

У MPFR действительно есть оболочка C ++, но в целом мне не так нравится ее использовать, как функции C, так как в прошлый раз, когда я смотрел на нее (правда, некоторое время назад), она не была настолько полнофункциональной.

Вероятно, стоит также отметить, что, поскольку ваша цель состоит в изучении C ++, а не в том, как эффективно аппроксимировать Pi, может быть предпочтительнее решить эту проблему, например, вместо этого просто извлеките первые n цифр из жестко запрограммированной строки, как сказал Крис.

4

Двойник будет иметь 53 бита точности. Каждый бит дает примерно 1/3 десятичной цифры (log (10) / log (2), если быть точным), что означает, что мы получаем приблизительно 53/3 цифры из двойного числа. Это должно дать 17 цифр (включая 3 в начале). Вполне вероятно, что atan(1) тоже не совсем все цифры pi / 4 (потому что atan а также любая другая тригонометрическая функция является приближением).

Если вам нужно намного больше цифр, чем примерно 12-14 цифр, вам нужно будет использовать библиотеку «большого числа», и есть ряд «умных» способов вычисления десятичных чисел PI.

0