#include
#include
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了
一时之间我也不知道用什么方法来判断更好,不过这个问题更应该由你来思考*/
第一次循环,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。
你这个智商做不出来正常。