c语言 改错拿错了,改成啥

近似求 PI:根据下式求 π 的近似值,直到最后一项小于给定精度 eps

img

img

img

有几个问题:
(1)fact函数求阶乘,当n大于15的时候,返回值超出int范围,所以,fact函数的返回值类型改成double类型
(2)multi函数同理,返回值类型也改成double
(3)因为eps是最后结果的精度,item是PI/2的的精度,所以 while循环条件应该是 while( item >= eps / 2)
(4)fact函数和multi函数中,result 从int改成double类型。
(5)fact函数for循环的 i 从1 开始
代码修改如下(修改部分有注释),如有帮助,望采纳,多谢。

#include <stdio.h>
double fact(int n); //修改 :返回值类型从int 改成double,否则结果容易越界
double multi(int n);  //修改 :返回值类型从int 改成double,否则结果容易越界
int main(void)
{
    double eps,item,sum;
    int i;

    printf("Enter eps: ");
    scanf("%le",&eps);
    i=0;
    item = 1;
    sum = 0;
    while( item >= eps/2) { //修改,因最后的结果要乘以2,所以emp要除以2
        sum = sum + item;
        i++;
        item = fact(i)/multi(2*i+1);
    }
    sum = sum + item;
    printf("PI = %0.5f\n",sum*2);

    return 0;
}

double fact(int n) //返回值类型改成double
{
    double result; //返回值int 改成double
    int i;

    result = 1;
    for(i=1;i<=n;i++) //修改,i从1开始
        result = result * i;
    return result;
}

double multi(int n) //返回值int类型改成double
{
    double result;//int 改成double
    int i;

    result = 1;
    for(i=3;i<=n;i=i+2){
        result = result * i;
    }
    return result;
}

错误是因为你在 Code::Blocks 中打开了一个没有项目文件的文件
确保打开的是一个项目文件,而不是单个源文件。如果你只是想打开一个源文件,可以使用“文件”菜单中的“新建文件”选项来创建一个新的项目文件。

for (i = 0; i <= n; i++)
result = result * i;
这里i不能从0开始,要从1或者2开始。否则结果肯定都是0了。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7519688
  • 除此之外, 这篇博客: C语言重难点知识梳理与常见题目/项目游戏解析中的 43.序列求和(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数eps,精确到最后一项的绝对值小于 eps(保留 6 位小数) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include <math.h>
    
    void t_4__4_3() {
        int deno = 1, flag = 1;
        float sum = 0, item = 1, eps;
        printf("Input eps:");
        scanf("%f", &eps);
        while (fabs(item) >= eps) {
            item = 1.0 * flag / deno;
            sum += item;
            deno += 3, flag *= -1;
        }
        printf("%f\n", sum);
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^