algorithm - это - что такое пи




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

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

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


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

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

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


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

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

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


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


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

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

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


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



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

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

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


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

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





pi