weijun_zhang 发表于 2021-4-11 18:12:33

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;
}

wp231957 发表于 2021-4-11 18:15:11

sum=sum+pow(-1,i+1)*(1.0/(2*i-1));
这样试一下

weijun_zhang 发表于 2021-4-11 18:28:04

wp231957 发表于 2021-4-11 18:15
sum=sum+pow(-1,i+1)*(1.0/(2*i-1));
这样试一下

还是不行{:5_100:}

肖-肖 发表于 2021-4-11 20:24:44

我觉得是你写的公式不对:
分析如下:
首先: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 希望有用吧!

qqqpang 发表于 2021-4-12 09:28:23

for(i=2;fabs(1/(2*i-1))>=pow(10,(-8));i++)
我觉得是这一句可能有问题 下面的sum怎么改都不行,但是还没有改出来

weijun_zhang 发表于 2021-4-13 16:30:17

肖-肖 发表于 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。
没有冒犯的意思,单纯想知道自己哪里出问题了,怎么改?敬请继续交流指正

weijun_zhang 发表于 2021-4-13 16:31:03

qqqpang 发表于 2021-4-12 09:28
for(i=2;fabs(1/(2*i-1))>=pow(10,(-8));i++)
我觉得是这一句可能有问题 下面的sum怎么改都不行,但是还 ...

正确应该是啥样的呢?我不清楚哪里错了?

肖-肖 发表于 2021-4-13 17:23:15

本帖最后由 肖-肖 于 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
我也看懂了点你这么写的原因--》挺巧妙的!!!
然后我还是修改了一下:还是没改好

我得去上课了,不能再找了!暂且

飞花落尽 发表于 2021-10-20 20:52:46

weijun_zhang 发表于 2021-4-13 16:31
正确应该是啥样的呢?我不清楚哪里错了?

我也是{:9_220:}
页: [1]
查看完整版本: S1E16课后第二题答疑