S1E16课后第二题答疑
根据以下已知公式求 Pi 的近似值,要求正确计算出小数点后前 7 位(即3.1415926)请问为何下面代码运行结果是pi=0.0000000?
#include <stdio.h>
#include <math.h>
int main()
{
long double pi,sum=1;
int i,n;
for(i=2;fabs(1/(2*i-1)>=pow(10,(-8)));i++)
{
sum=sum+pow(-1,i+1)*1/(2*i-1);
}
pi=4*sum;
printf("pi=%.7lf\n",pi);
return 0;
}
sum=sum+pow(-1,i+1)*(1.0/(2*i-1));
这样试一下 wp231957 发表于 2021-4-11 18:15
sum=sum+pow(-1,i+1)*(1.0/(2*i-1));
这样试一下
还是不行{:5_100:} 我觉得是你写的公式不对:
分析如下:
首先:fabs(1/(2*i-1)是求1/(2*i-1)第一次的话就是1/3的绝对值,下一次是1/5的绝对值这个是对的!
但是:sum=sum+pow(-1,i+1)*1/(2*i-1);
第一次的话是:sum=1+pow(-1,3)*1/(2*i-1)-->=1+(-1)的3次方*1/3->1+(-1)=0->导致了被除数为0
所以被除数都是0了,你觉得可能不是0吗?
首先除数是没什么问题的。
问题出现在了被除数,如上所述!
所以我改了你的代码,改动较大,但也是一般的解决思路!所有解释都在注释里,请查看
代码如下:
#include <stdio.h>
#include <math.h>
//用公式π/4=1- 1/3 + 1/5 - 1/7...求π的近似值,直到发现某一项的绝对值小于10^6为止
int main()
{
double pi=0.0,term = 1.0,i=1.0;//term表示当前项->用这个来判断是否小于10^6
int n=1;// i是除数,n是符号位就是正负
//fabs是求绝对值的意思
while(fabs(term)>=pow(10,-6))
{
//sum=sum+pow(-1,i+1)*1/(2*i-1);
pi+=term;//pi等于每个当前项加起来,就算是减法也可以是加法不是吗 所以不用定义sum了
i+=2;//除数+2每次,从1开始
n=-1*n;//符号每次变一次
term=n/i;//求每个当前项
}
pi*=4;
printf("pi=%10.7lf \n",pi);
return 0;
}
运行结果如下:
pi= 3.1415907
OK 希望有用吧! for(i=2;fabs(1/(2*i-1))>=pow(10,(-8));i++)
我觉得是这一句可能有问题 下面的sum怎么改都不行,但是还没有改出来 肖-肖 发表于 2021-4-11 20:24
我觉得是你写的公式不对:
分析如下:
首先:fabs(1/(2*i-1)是求1/(2*i-1)第一次的话就是1/3的绝对值,下一次 ...
您的评论里
”第一次的话是:sum=1+pow(-1,3)*1/(2*i-1)-->=1+(-1)的3次方*1/3->1+(-1)=0->导致了被除数为0“ 后面还有个/(2*i-1)啊?
另外,您算的结果是错的。 是 3.1415926。
没有冒犯的意思,单纯想知道自己哪里出问题了,怎么改?敬请继续交流指正
qqqpang 发表于 2021-4-12 09:28
for(i=2;fabs(1/(2*i-1))>=pow(10,(-8));i++)
我觉得是这一句可能有问题 下面的sum怎么改都不行,但是还 ...
正确应该是啥样的呢?我不清楚哪里错了? 本帖最后由 肖-肖 于 2021-4-13 17:24 编辑
weijun_zhang 发表于 2021-4-13 16:30
您的评论里
”第一次的话是:sum=1+pow(-1,3)*1/(2*i-1)-->=1+(-1)的3次方*1/3->1+(-1)=0->导致了被除数 ...
你的第一个问题:厉害厉害我咋当时就那么想了呢!!!
确实后边还有个/(2*i-1)那么按照运算符优先级的来做-》sum=1+(-1)的3次方*1/(4-1)-->1-1/3-->2/3 这是对的
再进行下一次的循环-》sum=sum+pow(-1,i+1)*1/(2*i-1)-->sum=2/3+(-1)^4*1/(2*3-1)=2/3+1 / 5=2/3 + 1/5 = 20/30 + 6/30 = 26/30
如果按公式上的来的话就是-》2/3+1/5=20/30 + 6/30=26/30
我也看懂了点你这么写的原因--》挺巧妙的!!!
然后我还是修改了一下:还是没改好
我得去上课了,不能再找了!暂且 weijun_zhang 发表于 2021-4-13 16:31
正确应该是啥样的呢?我不清楚哪里错了?
我也是{:9_220:}
页:
[1]