首先介绍一下计算公式,涉及两位大神,牛顿和欧拉。

c语言编写一个简易的计算器(分享一个利用C语言计算π的实现)(1)

反正切级数欧拉变换

这个方法收敛速度可以接受,但非最优方法,每算一项得到0.3个有效数字。

我们把公式展开:π/2=1 1/3 1/3*2/5 1/3*2/5*3/7 …… 1*2*3*……n/3*5*……*(2n 1)

并根据无穷递减的等比数列可知:

1/3 = 1/3*1/2 1/3*1/2*1/2 1/3*1/2*1/2*1/2 .......

因此,1/3 > 1/3*2/5 1/3*2/5*3/7 …… 1*2*3*……n/3*5*……*(2n 1)

所以式中第n项之后的所有余项之和Sum(Rn)<An因此,只要选取n,使得An满足An<1/10^(x 1)即可,根据对数运算规律:

c语言编写一个简易的计算器(分享一个利用C语言计算π的实现)(2)

对数运算法则

lg1/3 lg2/5 …… lgn/(2n 1)<-(x 1),即lg3 lg5/2 ...... lg(2n 1)/n<x 1。于是可设置对数累加实现计算到x位所需的项数n,为确保准确,算法可设置计算位数超过x位(如5位)但只打印出x位。

然后我们可以利用C语言实现高精度乘除法来进行对π的求解。下面给出代码:

#include<stdio.h> #include<math.h> int a[5000]; int main() { // π/2=1 1/3 1/3*2/5 1/3*2/5*3/7 …… 1*2*3*……n/3*5*……*(2n 1) // π/2= 1 1/3(1 2/5(1 …… (n-1)/(2n-1)(1 n/(2n 1))……); float s; int b,x,n,c,i,j,d,l; printf("欢迎您的验证,现在我们开始验证π的高精度的计算。\n"); printf("请输入精确位数:"); scanf("%d",&x); for(s=0,n=1;n<=5000;n )//累加确定项数n. { s=s log10((2*n 1)/n);//对数的加法对应各项相乘 if(s>x 1) break; } //高精度:数组高位存数字低位,a[0]保存π的整数位 for(c=1,j=n;j>=1;j--)//按公式分布计算,计算时,从2n 1反向计算 { d=2*j 1; for(i=0;i<=x 4;i ) //各位实施除2j 1.除法从数字高位到低位 { a[i]=c/d; c=(c%d)*10 a[i 1]; } a[x 5]=c/d; for(b=0,i=x 5;i>=0;i--)//各位实施乘j.乘法数字低位到高位 { a[i]=a[i]*j b; b=a[i]/10; a[i]=a[i]; } a[0]=a[0] 1;//加一直接作用在整数位 c = a[0]; //更新下次运算的被除数 } //公式所求为 π/ 2故需要对结果乘2 for(b=0,i=x 5;i>=0;i--) { a[i]=a[i]*2 b; //该位乘2并加进位值 b=a[i]/10; //高精度乘之进位值 a[i]=a[i]; //计算本位数值 } printf("PI=%d.",a[0]);//诸位输出计算结果。 for(l=10,i=1;i<=x;i ) { printf("%d",a[i]); l ; if(l==0) printf(" "); if(lP==0) printf("\n"); } return 0; }

最后分享一下小数精度1000位的π

c语言编写一个简易的计算器(分享一个利用C语言计算π的实现)(3)

高精度π

,