7

我正在寻找一个公式/算法来以给定的精度计算 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也许解决此问题的方法是计算th 和th 计算项之间的差异,n并将其视为当前误差。

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

4

3 回答 3

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

输出:

3.141592653589793115997963468544185161590576171875
3.141592653589793115997963468544185161590576171875

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

于 2010-12-19T18:57:56.023 回答
3

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

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

于 2010-12-19T22:41:58.767 回答
-2

你可以只做 arctan(1) 的泰勒包络,然后你会得到 pi/4 只是对所有其余部分求和。arctan 的泰勒信封(1)

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

您也可以使用 z=1 的欧拉公式,然后将结果乘以 4。

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

于 2014-10-07T19:47:22.213 回答