C++ π 的计算
今天是3.14,我们用C++ 以各种方法试着来计算一下π的值。
割圆术:
迭代公式为:
long double circle_cutting(int n)
long double a = 1.0;
for(int i=0; i< n ; i++)
a = sqrt(2.0L-sqrt(4.0L-a*a));
return 3*pow(2,n)*a;
}
沃利斯乘积公式:
long double Wallis(long int n)
//收敛的非常慢!
long double s =1.0L;
long double a;
for (int i = 1 ;i <= n; i++)
a = 4.0L*i*i/(2*i-1.0)/(2*i+1.0);
s *= a;
//cout<<s<<endl;
return 2*s;
}
格雷果里-莱布尼茨公式:
x =1 时,结果即为 π/4。
long double Leibniz(long int n)
//格雷果里-莱布尼茨公式法
//收敛的非常慢!
long double s =1.0L;
long double a;
for (int i = 1 ;i <= n; i++)
a = 1.0L/(2*i+1.0);
if(i%2)
a = 0-a;
s += a;
return 4*s;
}
积分法:
long double integral(long int n)
//1/4圆 积分。圆心在(0,0),半径为1
long double s = 0.0;
long double a,x;
for (int i = 1 ;i <= n; i++)
x = 1.0L * i / n;
a = 1.0L / n * sqrt(1 - x*x);
s += a;
//cout<<s<<endl;
return 4*s;
}
概率法:
x 在0~1, 且y在0~1的矩形内随机丢点,点落在中心为(0.5,0.5),半径为0.5的圆内的概率是pi/4。
long double random_drop(long int n)
long double x, y, a ,b;
long int s = 0;
for (int i=0; i < n; i++)
x = rand()/(double)RAND_MAX;
y = rand()/(double)RAND_MAX;
a = x-0.5;
b = y-0.5;
if (a*a + b*b <= 0.25)
s += 1;
return 4.0L * s / n;
main函数部分:
#include <iostream>
#include <cmath>
#include<iomanip>
using namespace std;
long double circle_cutting(int);
long double Wallis(long int);
long double Leibniz(long int);
long double integral(long int);
long double random_drop(long int);
int main()
cout <<setprecision(12)<<circle_cutting(17)<<endl;//第17次迭代到相对最优