这个公式精确度不大试试这个公式吧(收敛太慢了,下面的收敛比较快)
π/2=1+1/3+1/3*2/5+1/3*2/5*3/7+....
修改了你的程序编写出来的。
#include
#include
int c[2000]={0},g[2000]={0};
int N=0;
#define M 15
#define P 15
void f(int a,int b)
{ int i,j=0,z;
int d[1000],f[1000];
for(i=1;;i++)
{ d[i]=a/b;
f[++j]=a%b;
a=f[j]*10;
if(f[j]==0)
break;
if(i==1)
continue;
if(j>100)
break;
z=j;
while(--z)
if(f[j]==f[z])
break;
if(z==0)
continue;
else
{N=j-z;
break;
}
}
a=1000,b=0;
int h;
i=0;
if(N==0)
{ for(h=2;h<=j;h++)
{b=d[h]*a+b;
if(a==1)
{ c[++i]=b;
b=0;
a=10000;
}
a=a/10;
}
if((j-1)%8!=0)
c[++i]=b;
}
else
{ for(h=2;h<=z;h++)
{b=d[h]*a+b;
if(a==1)
{ c[++i]=b;
b=0;
a=10000;
}
a=a/10;
}
int n;
n=z;
for(;;)
{ b=d[++n]*a+b;
if(n==j)
n=z;
if(a==1)
{ c[++i]=b;
b=0;
a=10000;
}
a=a/10;
if(i==M)
break;
}
}
N=0;
}
void add()
{ int i,t,b=0;
for(i=P;i>=0;i--)
{ t=g[i]+c[i]+b;
if(t<=10000)
{ g[i]=t;
b=0;}
if(t>10000)
{ b=1;
g[i]=t%10000;
}
}
}
void mul(int k[])
{ int i,j,b,t,z=0,h,n,a=0,l=0,y;
int d[1000]={0},f[1000]={0},p[1000]={0};
i=0;
while(c[i]==0)
i++;
a=i;
j=0;
while(k[j]==0)
j++;
l=j;
for(i=M;i>=a;i--)
{ b=0,h=1;
for(j=M;j>=l;j--)
{t=c[i]*k[j]+b;
d[h++]=t%10000;
b=t/10000;
}
if(b!=0)
d[h]=b;
else
h--;
z++,b=0;
n=z;
for(j=1;j<=h;j++,n++)
{ t=f[n]+d[j]+b;
f[n]=t%10000;
b=t/10000;
}
if(b!=0)
f[n]=b;
else
n--;
}
j=0;
if(f[n]/1000!=0)
j=j+4;
else if(f[n]/100!=0)
j=j+3;
else if(f[n]/10!=0)
j=j+2;
else if(f[n]/1!=0)
j++;
n--;
j=j+n*4;
y=M*8-j;
n++;
j=y/4;
for(i=1;i<=j;i++)
c[i]=0;
for(;i<=M;i++)
c[i]=f[n--];
}
void mul2()
{int i,t,b,a=0;
for(i=P;i>=0;i--)
{ t=g[i]*2+a;
b=t%10000;
a=t/10000;
g[i]=b;
}
}
void total()
{ int i,j,a=1,b=3;
int h[1000]={0};
f(1,3);
add();
for(j=0;j<=P;j++)
h[j]=g[j];
for(i=1;i<=500;i++)
{ a++;
b=b+2;
for(j=0;j<=P;j++)
c[j]=0;
f(a,b);
mul(h);
for(j=0;j<=P;j++)
h[j]=c[j];
add();
}
g[0]=g[0]+1;
mul2();
}
int main()
{ int i;
double clk;
total();
for(i=0;i<=13;i++)
printf("%d ",g[i]);
putchar('\n');
clk=clock();
printf("time=%lf\n" , clk/CLOCKS_PER_SEC );
return 0;
}
//用这个公式算50位是不是有点难了?!,自己写的小代码,供参考吧
#include
#include
#include
int main(void)
{
register double dPai=0,d=0;
register long i;
register int flag=1;
clock_t clk=0;
i=0;
do {
d=dPai ;
dPai += flag*1.0/(2*i+1);
flag = -flag ;
i++ ;
} while ( fabs(d-dPai) > 1e-10 );//1e-10就需要很长时间,不知道1e-50会需要多久
clk=clock();
printf("i=%ld , pai=%.50lf\n" , i , 4*dPai );
printf("time=%lf\n" , clk*1.0/CLOCKS_PER_SEC );
return 0;
}
少年,七是个非常神奇的数字,要知道,浮点型数据打印输出的话要是不指定格式,某人保留就是七位,换句话说,我虽然没看你的程序,但是我觉得你可以吧printf语句里的%f改一改,去搜一下c格式话字符串,怎么样保留多少位
你的代码好复杂!
这是一个级数逼近的习题,你可以用循环或者递归.
所谓逼近就是近似值的准确度最大化,也就是会影响总值的项式值接近0(n<=10e-x),x越大精度越大.
考虑一下数据的存储和各项的变化规律.
神呢 你写那么长 要是保留7位的话要这样输出:
printf(“%.7lf”);//.7很重要啊...你的程序没有看只是看了输出 还是有时间了我帮你看看那..