Подтвердить что ты не робот

Как вычисляется pi (π)?

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

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

4b9b3361

Ответ 1

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

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

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

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


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

Ответ 4

В качестве альтернативы методу 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

Ответ 5

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

Ответ 6

Я считаю, что алгоритм, который вы ищете, известен как "Алгоритм Spigot". Одним из конкретных видов является формула BBP (Bailey-Borwein-Plouffe).

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

Ответ 7

" π IN MANDELBROT SET" исследует любопытную взаимосвязь между последовательностью точек на комплексной плоскости и как вычисляет их число Мандельброта "(из-за отсутствия лучшего термина... количество итераций, необходимых для определения того, что точки в последовательности не являются членами множества Мандельброта) относится к PI.

Практические? Наверное, нет.

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

Ответ 8

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

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

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

Ответ 9

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

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

// 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 в пределах вашего верхнего предела.

Ответ 10

Я бы начал с формулы

pi = 16 arctan (1/5) - 4 arctan (1/239)

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

Ответ 11

pi = function () {
    let pi = 3;
    let a = 3;
    let even = false;
    let turn;

    while (a <= 90000) {
        turn = (4/((Math.pow(a, 3)) - (a)));

        if(even){
            turn = turn*-1;
            even = false;
        } else {
            even = true;
        }
        pi = pi + turn;
        a = a + 2;
    }
    return pi;
};

Ответ 12

Рассмотрим этот приблизительный эскиз, но это простой подход, который может реализовать новичок.

int x = 9;
double pi = double(22/7);
String piAsString = pi.toString();
String valueAtXPosition = piAsString.subString(x, x+1);
int valueAtXPosAsInt = Integer.parseInt(valueAtXPosition);