Как пи (π) вычислено?

Как я могу записать функцию, которая возвратит пи (π) данному количеству десятичных разрядов?

Скорость не является беспокойством. Я смотрел на http://bellard.org/pi/, но я все еще не понимаю, как получить энную цифру пи.

34
задан the Tin Man 29 October 2016 в 21:10
поделиться

9 ответов

В исчислении есть вещь, называемая рядами Тейлора, которая обеспечивает простой способ вычисления многих иррациональных значений с произвольной точностью.

Pi / 4 = 1 - 1/3 + 1/5 - 1/7 + ...
(из http://www.math.hmc.edu/funfacts /ffiles/30001.1-3.shtml)

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

Теорема Тейлора - мощный инструмент, но вывод этой серии с помощью этой теоремы выходит за рамки вопроса. Это стандартная университетская программа первого года обучения, которую можно легко погуглить, если вас интересуют более подробные сведения.


Я не имел в виду, что это наиболее практичный метод вычисления числа Пи. Это будет зависеть от того, зачем вам это нужно. Для практических целей вы должны просто скопировать столько цифр, сколько вам нужно, из одной из многих опубликованных версий. Я предлагал это как простое введение в то, как иррациональные значения могут быть приравнены к бесконечным рядам.

30
ответ дан 27 November 2019 в 16:08
поделиться

Вы хотите искать значения вместо их вычисления?

Поскольку вы явно не указали, что ваша функция должна вычислять значения, вот возможное решение , если вы хотите чтобы иметь верхний предел количества цифр, которые он может «вычислить» :

// Initialize pis as far out as you want. 
// There are lots of places you can look up pi out to a specific # of digits.
double pis[] = {3.0, 3.1, 3.14, 3.141, 3.1416}; 

/* 
 * A function that returns pi out to a number of digits (up to a point)
 */
double CalcPi(int x)
{
    // NOTE: Should add range checking here. For now, do not access past end of pis[]
    return pis[x]; 
}

int main()
{
    // Loop through all the values of "pi at x digits" that we have.
    for (int ii=0; ii<(int)sizeof(pis)/sizeof(double); ii++)
    {
        double piAtXdigits = CalcPi(ii);
    }
}

Написание CalcPi () таким образом (если это соответствует вашим потребностям) имеет побочное преимущество, так как одинаково быстро кричит для любого значения X в пределах ваш верхний предел.

3
ответ дан 27 November 2019 в 16:08
поделиться

Вы можете определить точность на основе последнего добавленного (или вычтенного) члена. Поскольку амплитуда каждого члена в последовательности Алана всегда уменьшается, и каждый член меняет знак, сумма не изменится больше, чем последний член.

Перевод этой болтовни: после добавления 1/5 сумма не изменится более чем на 1/5, так что вы будете точны с точностью до 1/5. Конечно, вам придется умножить это на 4, так что вы действительно точны только до 4/5.

К сожалению, математика не всегда легко переводится в десятичные числа.

2
ответ дан 27 November 2019 в 16:08
поделиться

« π В НАБОРЕ МАНДЕЛЬБРОТА » исследует любопытную взаимосвязь между последовательностью точек на комплексной плоскости и вычислением их «Мандельброта». число "(из-за отсутствия лучшего термина ... количество итераций, необходимых для определения того, что точки в последовательности не являются членами множества Мандельброта) относится к PI.

Практично? Возможно нет.

Неожиданно и интересно? Я так думаю.

5
ответ дан 27 November 2019 в 16:08
поделиться

Последняя формула: http://en.wikipedia.org/wiki/Bellard%27s_formula

12
ответ дан 27 November 2019 в 16:08
поделиться

В качестве альтернативы методу JeffH для хранения каждого варианта вы можете просто сохранить максимальное количество цифр и вырезать то, что вам не нужно:

#include <string>
#include <iostream>
using std::cout; using std::endl; using std::string;

// The first 99 decimal digits taken from:
// http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html
// Add more as needed.
const string pi =
  "1415926535"
  "8979323846"
  "2643383279"
  "5028841971"
  "6939937510"
  "5820974944"
  "5923078164"
  "0628620899"
  "8628034825"
  "342117067";

// A function in C++ that returns pi to X places
string CalcPi(const size_t decimalDigitsCount) 
{
  string returnValue = "3";
  if (decimalDigitsCount > 0)
  {
    returnValue += "." + pi.substr(0, decimalDigitsCount);
  }
  return returnValue;
} 

int main()
{
  // Loop through all the values of "pi at x digits" that we have. 
  for (size_t i = 0; i <= pi.size(); ++i) 
  {
    cout << "pi(" << i << "): " << CalcPi(i) << endl;
  } 
}

http://codepad.org/6mqDa1zj

8
ответ дан 27 November 2019 в 16:08
поделиться

Попробуйте « Вычисление n-й цифры числа Пи в любом основании в O (n ^ 2) ». Это, вероятно, самый быстрый из известных алгоритмов, который не требует произвольных (читай огромных ) прецизионных чисел с плавающей запятой и может дать вам результат непосредственно в базе 10 (или любой другой).

6
ответ дан 27 November 2019 в 16:08
поделиться

Я считаю, что алгоритм, который вы ищете, известен как «алгоритм втулки». Одним из конкретных видов является формула BBP (Бейли-Борвейн-Плафф).

Я считаю, что это то, что вы ищете.

6
ответ дан 27 November 2019 в 16:08
поделиться

Существует множество алгоритмов числового приближения числа π .

27
ответ дан 27 November 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: