C语言计算圆周率,为什么得不到想要的结果,求大神帮助

用这个方法计算圆周率:π/2=2/1 * 2/3 * 4/3 *4/5* 6/5……*2n/(2n-1) * 2n/*(2n+1) 计算到10^-5
这个方法没有问题。
下面是我的c语言程序:
#include<stdio.h>
#include<math.h>
double pi,r;
#define eps 1e-5
int n;
main(){
r=0;
pi=1;
for(n=1;fabs(pi-r)>eps;n++){
pi=2*2.0*n/(2*n-1)*2.0*n/(2*n+1)*pi;
r=pi;}
printf("%.5f\n%d\n",pi,n);
}
而计算的答案是2.6667,n=2,仅仅两次循环就停止了。这是哪里出问题了呢?

#include<stdio.h>
#include<math.h>
double pi,r;
#define eps 1e-5
int n;
main()
{
r=0;
pi=1;
for(n=0;fabs(pi-r)*2>eps;n++)//最后,你这里的判断要*2,因为结果要*2 ,要得到循环次数的话n要从0开始计数
{
r=pi;//首先这个应放在前面,不然就r==p了,pi-r就等于0了。 
pi=2.0*n/(2*n-1)*2.0*n/(2*n+1)*pi;//然后这里最前面不要乘以2,最后得出结果才乘 
printf("测试1:pi=%.15lf\tr=%.15lf\n",pi,r);// 测试1 
printf("测试2:pi-r=%.15lf\n",fabs(pi-r));// 测试2
}
pi*=2;//结果乘以2 
printf("%.5f\n%d\n",pi,n);
}
/*好了,上面的修改应该就是你想表达的思路了,但是结果却不是正确的
因为你想当然的认为pi-r<=eps了结果的精度就是eps
但2n/(2n-1) * 2n/*(2n+1)是大于1的,也就是说计算的pi会一直增下去
退出循环时的增量pi-r<=eps,不代表以后所有的增量加起来都不大于eps
比如退出循环时pi-r=0.00001,如果继续循环的话假设下一次的增量是0.000009,再下一次是0.000008
都是<0.00001的,但这两个加起来就大于0.00001了
一时之间我也不知道用什么方法来判断更好,不过这个问题更应该由你来思考*/

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-05-23
第一次循环,r=0;pi=1;fabs(pi-r)>eps成立,计算一个pi的值,然后pi的值赋给了r。然后循环第二次。第二次循环,r=2,pi-r=pi-pi=0,fabs(pi-r)>eps不成立,跳出循环。改的话你把r=pi放在pi=2*2.0*n/(2*n-1)*2.0*n/(2*n+1)*pi的前面,这样就不会让r和pi的值重叠。(此时r表示前一次pi的值),相应的循环的时候改成pi-r。
第2个回答  2015-05-23
你这个智商做不出来正常。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网