Вопрос

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

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

Это было полезно?

Решение

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

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

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

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


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

Другие советы

Есть много алгоритмов для Числовое приближение π.

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

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

#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

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

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

Пытаться "Вычисление N'th Digit of Pi в любой базе в O (n ^ 2)«. Это, вероятно, самый быстрый известный алгоритм, который не требует произвольного (прочитать огромный) точность поплавки, и может дать вам результат непосредственно в базу 10 (или любой другой).

"π в наборе Mandelbrot«Испытает любопытные отношения между последовательностью точек на сложной плоскости и на то, как вычислить их« номер Mandelbrot »(для отсутствия лучшего срока ... Количество итераций, необходимых для определения того, что точки в последовательности не являются членами Mandelbrot Set) относится к Pi.

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

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

Вы готовы посмотреть значения вместо того, чтобы вычислить их?

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

// 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);
    }
}

Написать CALTPI () таким образом (если оно соответствует вашим потребностям), имеет побочную выгоду одинаково кричать быстро для любого значения x в верхнем пределе.

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

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

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

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

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

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

Мои два цента ... Это может быть не самый быстрый, но я думаю, что это довольно легко понять. Я придумал это во время лекции по математике, и я не видел этого нигде в литературе. Либо я гений, действительно глупый, либо на самом деле не обращаю внимания на чтение книг о математике, или все вышеперечисленное ... :)

Во всяком случае ... начните с единицы круга. Мы знаем, что x ^ 2 + y ^ 2 = 1, так что y = sqrt (1-x ^ 2). Мы также знаем, что область единицы круга - это Pi. Если теперь мы сделаем интеграл функции SQRT (1-X ^ 2) в диапазоне от 0 до 1, мы получим четверть PI. Так умните его на 4, чтобы получить PI:

PI formula

Если бы мы попытались решить эту аналитически, я уверен, что мы просто получили бы Пиа. Но это довольно легко написать программу, чтобы решить ее численно. Следующее находится в C:

#include <math.h>
#include <stdio.h>

void main(void) {
    double interval=0.0000001,area=0,x,y;

    for (x=0; x<1; x+=interval)
        area+=4*interval*sqrt(1-x*x);

    printf("pi ~ %.20f\n",area);
}

Работает с вышеупомянутой настройкой для interval, мы получили:

pi ~ 3.14159285415672595576

Так что 10 000 000 итераций дают 6 правильных десятичных знаков. Не самый эффективный, но это мой ребенок ... :)

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;
};

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

int x = 9;
double pi = double(22/7);
String piAsString = pi.toString();
String valueAtXPosition = piAsString.subString(x, x+1);
int valueAtXPosAsInt = Integer.parseInt(valueAtXPosition);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top