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

时间:2010-12-19 18:41:34

标签: 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 )

(注意(-1)^(k + 1)可以由上述算子轻松实现。

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

此问题的解决方法可能是计算n-1n计算的术语之间的差异,并将其视为当前错误。

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

3 个答案:

答案 0 :(得分:4)

Codepad link

#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

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

答案 1 :(得分:3)

在原始(缓慢收敛)示例中,可以计算错误项,因为这是交替序列;见http://en.wikipedia.org/wiki/Alternating_series#Approximating_Sums

基本上,下一个未计算的术语是错误的界限。

答案 2 :(得分:-2)

你可以做arctan(1)的泰勒信封然后你会得到pi / 4只是总结所有剩下的部分。 arctan的泰勒信封(1)

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

你也可以使用z = 1的euler公式,然后将结果乘以4.

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