我正在寻找一个公式/算法来计算给定精度的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
计算的术语之间的差异,并将其视为当前错误。
无论如何,我正在寻找具有这些属性的公式/算法,并且还能更快收敛到Pi
答案 0 :(得分:4)
#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