使用基本算术来计算具有任意精度的Pi

Isa*_*aac 5 algorithm math pi

我正在寻找一个公式/算法来计算给定精度的PI~3.14.

公式/算法必须只有非常基本的算术

  • +:加法
  • - :减法
  • *:乘法
  • /:Divison

因为我想用C++实现这些操作,并希望尽可能简化实现(不允许使用bignum库).

我发现这个计算Pi的公式非常简单:

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

(注意,(-1)^(k + 1)可以由上述运算符容易地实现).

但是这个公式的问题是无法指定要计算的位数.换句话说,没有直接的方法来确定何时停止计算.

也许这个问题的解决方法是计算n-1th和nth计算的术语之间的差异,并将其视为当前错误.

无论如何,我正在寻找具有这些属性的公式/算法,并且还能更快地收敛到Pi

Gab*_*aru 6

键盘链接

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

3.141592653589793115997963468544185161590576171875
3.141592653589793115997963468544185161590576171875
Run Code Online (Sandbox Code Playgroud)

这实际上是Bailey-Borwein-Plouffe 公式,也取自维基百科的链接。


Kei*_*ith 3

在您原来的(缓慢收敛)示例中,可以计算误差项,因为这是一个交替序列;请参阅http://en.wikipedia.org/wiki/Alternating_series#Approximating_Sums

本质上,下一个未计算的项是误差的界限。