Использование базовой арифметики для вычисления Pi с произвольной точностью - PullRequest
5 голосов
/ 19 декабря 2010

Я ищу формулу / алгоритм для вычисления PI ~ 3,14 с заданной точностью.

Формула / алгоритм должен иметь только очень базовую арифметику, как

  • +: сложение
  • -: вычитание
  • *: умножение
  • /: деление

, потому что я хочу реализовать эти операции в C ++ и сохранитьРеализация настолько проста, насколько это возможно (библиотека bignum не допускается).

Я обнаружил, что эта формула для вычисления Pi довольно проста:

Pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...  = sum( (-1)^(k+1)/(2*k-1) , k=1..inf )

(обратите внимание, что (-1) ^ (k + 1) может быть легко реализовано вышеуказанными операторами).

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

Возможно, для решения этой проблемы можно вычислить разницу между n-1 -ым и n -ым вычисленным слагаемым и рассмотреть его кактекущая ошибка.

В любом случае, я ищу формулу / алгоритм, которые имеют эти свойства и также сходятся быстрее к Пи

Ответы [ 3 ]

4 голосов
/ 19 декабря 2010

Ссылка на кодовую панель :

#include <iostream>
#include <cmath>
int main()
{
    double p16 = 1, pi = 0, precision = 10;

    for(int k=0; k<=precision; k++)
    {
        pi += 1.0/p16 * (4.0/(8*k + 1) - 2.0/(8*k + 4) - 1.0/(8*k + 5) - 1.0/(8*k+6));
        p16 *= 16;
    }
    std::cout<<std::setprecision(80)<<pi<<'\n'<<M_PI;
}

Вывод:

3.141592653589793115997963468544185161590576171875
3.141592653589793115997963468544185161590576171875

Это на самом деле формула Бэйли-Борвейна-Плуффа , такжевзято по ссылке из википедии.

3 голосов
/ 20 декабря 2010

В вашем исходном (медленно сходящемся) примере термин ошибки может быть вычислен, потому что это чередующийся ряд ;см. http://en.wikipedia.org/wiki/Alternating_series#Approximating_Sums

По существу, следующий невычисляемый термин является пределом ошибки.

0 голосов
/ 07 октября 2014

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

http://en.wikipedia.org/wiki/Taylor_series

Также вы можете использовать формулу Эйлера с z = 1, а затем умножить результат на 4.

http://upload.wikimedia.org/math/2/7/9/279bed5a2ea3b80a71f5b22078090168.png

...