鱼C论坛

 找回密码
 立即注册
查看: 3150|回复: 8

S1E16课后第二题答疑

[复制链接]
发表于 2021-4-11 18:12:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
根据以下已知公式求 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;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-11 18:15:11 From FishC Mobile | 显示全部楼层
sum=sum+pow(-1,i+1)*(1.0/(2*i-1));
这样试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-11 18:28:04 | 显示全部楼层
wp231957 发表于 2021-4-11 18:15
sum=sum+pow(-1,i+1)*(1.0/(2*i-1));
这样试一下

还是不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 希望有用吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 09:28:23 | 显示全部楼层
for(i=2;fabs(1/(2*i-1))>=pow(10,(-8));i++)  
我觉得是这一句可能有问题 下面的sum怎么改都不行,但是还没有改出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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。
没有冒犯的意思,单纯想知道自己哪里出问题了,怎么改?  敬请继续交流指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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怎么改都不行,但是还 ...

正确应该是啥样的呢?  我不清楚哪里错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
我也看懂了点你这么写的原因--》挺巧妙的!!!
然后我还是修改了一下:还是没改好
ls43.png
我得去上课了,不能再找了!暂且
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-20 20:52:46 | 显示全部楼层
weijun_zhang 发表于 2021-4-13 16:31
正确应该是啥样的呢?  我不清楚哪里错了?

我也是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 17:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表