圆周率有很多计算的方法,但是在计算机程序中如何实现圆周率的计算呢,通常我们可以通过代码实现计算圆周率的公式来得到比较精确的圆周率,如下代码我们实现了计算圆周率的莱布尼茨公式(π/4=1-1/3+1/5-1/7+1/9-1/11+……),由于圆周率π的小数位是无限的,普通的数据类型是无法得到任意位精度的计算,我们通过模拟加减乘除的竖式计算,使用数组来存储圆周率π的每一位数,从而实现了超长小数位精度的计算,对于越高精度的计算,所花费的时间越长,需要计算机的性能越高:
1、实现分数计算函数,得到超长小数位精度的结果
void jsxs(int fz, int fm, int* ret)
{
int pos = 0;
ret[pos++] = fz/fm;
int r=fz%fm;
int i = 1;
while(i<20){
ret[pos++] = (r*10)/fm;
r=(r*10)%fm;
i++;
}
}
2、实现超长小数位精度的竖式加法函数
void add(int* shu1, int* shu2) {
int jw = 0;
int tmp;
for(int i=19;i>=0;i--){
tmp = shu1[i] + shu2[i] + jw;
shu1[i] = tmp%10;
jw = tmp/10;
}
}
3、实现超长小数位精度的竖式减法函数
void sub(int* shu1, int* shu2) {
int jw = 0;
int tmp;
for(int i=19;i>=0;i--){
tmp = shu1[i] - jw;
if (tmp < shu2[i]) {
tmp += 10;
jw=1;
} else {
jw=0;
}
shu1[i] = tmp - shu2[i];
}
}
4、实现超长小数位精度的竖式乘法函数
void mult(int* shu1, int shu2) {
int jw = 0;
int tmp;
for(int i=19;i>=0;i--){
tmp = shu1[i] * shu2 + jw;
shu1[i] = tmp%10;
jw = tmp/10;
}
}
5、实现打印超长小数的函数
void printData(int* ret) {
for(int i=0;i<20;i++){
cout<<ret[i];
if (i == 0) {
cout<<".";
}
}
cout<<endl;
}
6、实现数组初始化函数
void clear(int* shu) {
for(int i=0;i<20;i++){
shu[1] = 0;
}
}
7、实现莱布尼茨公式(π/4=1-1/3+1/5-1/7+1/9-1/11+……)函数,计算圆周率
void pai(int* ret) {
long long a,q=0,s=1;
int xiaoshu[20] = {};
cin>>a;
for(int i=1;i<=a;i++){
q++;
s+=2;
jsxs(1, s, xiaoshu);
if(q%2!=0){
sub(ret, xiaoshu);
}else{
add(ret, xiaoshu);
}
}
mult(ret, 4);
}
8、主函数main
int main()
{
for(int i=0;i<=1000;i++){
int ret[20] = {1};
pai(ret);
printData(ret);
}
return 0;
}