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

#include <stdio.h>
#include <math.h>
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
你可以试一下
好的话
请采纳追问

什么叫溢出啊?那句子怎么就溢出了啊

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-26
#include <stdio.h>
#include <math.h>
double fun ( double eps)
{int i=1,s=1,t=1;
double j=1;//把j初始化即可
double 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) ;
}追问

不会的3.14.。。啊好像是3.09.。。

追答

当你的精度是0.005的时候。

第2个回答  2011-03-26
#include <stdio.h>
#include <math.h>

double fun ( double eps)
{
int i=1,s=3;
double j=1.0,sum=1.0;
while(j>eps){
j *= (float)i/s;
sum += j;
i++;
s += 2;
}
return sum*2;
}

int main( )
{
double x;void NONO ();

setbuf(stdout,NULL);
printf("Input eps:") ;
scanf("%lf",&x);
printf("\neps = %lf, PI=%lf\n", x, fun(x));
NONO();

return 0;
}

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) ;
}
第3个回答  2011-03-26
double j,sum=1.0;
while(j>=eps)
j没有初始化追问

j初始化还是没用啊