我正在寻找一个公式/算法来计算给定精度的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 )
Run Code Online (Sandbox Code Playgroud)
(注意,(-1)^(k + 1)可以由上述运算符容易地实现).
但是这个公式的问题是无法指定要计算的位数.换句话说,没有直接的方法来确定何时停止计算.
也许这个问题的解决方法是计算n-1
th和n
th计算的术语之间的差异,并将其视为当前错误.
无论如何,我正在寻找具有这些属性的公式/算法,并且还能更快地收敛到Pi
键盘链接:
#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 公式,也取自维基百科的链接。
在您原来的(缓慢收敛)示例中,可以计算误差项,因为这是一个交替序列;请参阅http://en.wikipedia.org/wiki/Alternating_series#Approximating_Sums
本质上,下一个未计算的项是误差的界限。