分享一个利用C语言计算π的实现

分享一个利用C语言计算π的实现

编码文章call10242024-12-13 11:57:5333A+A-

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

这个方法收敛速度可以接受,但非最优方法,每算一项得到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)即可,根据对数运算规律:


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]%10;
		}
		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]%10;  //计算本位数值 
	}
	printf("PI=%d.",a[0]);//诸位输出计算结果。
	for(l=10,i=1;i<=x;i++)
	{
		printf("%d",a[i]);
		l++;
	 	if(l%10==0)
	 		printf(" "); 
	 	if(l%50==0)
	 		printf("\n");
	}
	return 0;
}

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


点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4