作业帮 > 综合 > 作业

c语言求PI值,使其精度小于0.005,为什么运行不到结果啊,

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/25 18:14:35
c语言求PI值,使其精度小于0.005,为什么运行不到结果啊,
#include
#include
double fun ( double eps)
{int i=1,s=1,t=1;
double j,sum=1.0;
while(j>=eps)
{
t=t*i;
s=s*(2*i+1);
j=1.0*t/s;
sum=sum+j;
i++;
}
return sum*2;
}
main( )
{ double x;void NONO ();
printf("Input eps:") ;
scanf("%lf",&x); printf("\neps = %lf,PI=%lf\n",x,fun(x));
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件.*/
FILE *fp,*wf ;
int i ;
double x ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp,"%lf",&x) ;
fprintf(wf,"%lf\n",fun(x)) ;
}
fclose(fp) ;
fclose(wf) ;
}
这是原题
帮你研究了下 问题有两点
一 、while(j>=eps) 这句话的时候 j没初始化没有被赋值 怎么比啊?
建议改一下:
while(j>=eps)
{
t=t*i;
s=s*(2*i+1);
j=1.0*t/s;
sum=sum+j;
i++;
}
return sum*2;
}
改成 do while
do
{
t=t*i;
s=s*(2*i+1);
j=1.0*t/s;
sum=sum+j;
i++;
}
return sum*2;
}while(j>=eps);
二、本程序当输入的精度 很精时 ,会发生溢出 当然这时候系统不会提示你溢出 而回运行得到错误的结果 即 你说的 不会的3.14..啊好像是3.09..
s=s*(2*i+1); //s 发生溢出了
故修改成:int i=1,s=1,t=1;------》double i=1,s=1,t=1; 这样就不会溢出了 ,随着精度的精确 越来越接近3.1415926
你可以试一下
好的话
请采纳
再问: 什么叫溢出啊?那句子怎么就溢出了啊
再答: 溢出呢 就是这个意思 int i=1,s=1,t=1; //这句话声明了四个int类型的变量, int类型的量在内存中一般分配四个字节来存储,显然int类型表示的数据范围很有限的 -2147483648~~2147483647 s=s*(2*i+1); 我不是说这句话溢出,意思是这句话的运算 每循环一次 s增加的比较快,所以很有可能溢出