You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言近似计算π结果异常,请求代码错误排查

问题分析与代码修正

你的代码存在三处核心错误,导致计算结果严重偏离π的真实值:

错误点1:累加初始值错误

该公式是各项结果的累加和,初始值必须设为0.0,而非0.1。初始值错误会直接导致整个累加结果的基础偏移。

错误点2:公式项的计算逻辑错误

原代码错误地将1/16^i(即pi_5)作为减法项放入括号内,而根据公式,正确逻辑是:先计算括号内的4/(8i+1) - 2/(8i+4) - 1/(8i+5) - 1/(8i+6),再将结果乘以1/16^i,最后累加到π的近似值中。

错误点3:1/16^i的循环计算错误

原代码循环条件j <= i会导致多乘一次1/16:

  • 当i=0时,循环执行1次得到1/16,但实际应为1/16^0 = 1
  • 正确循环条件应为j < i,确保i=0时循环不执行,pi_5保持初始值1;i=1时循环执行1次得到1/16,以此类推。

修正后的代码

#include <stdio.h>

int main()
{
    int n, i;

    printf("n = ");
    scanf("%d", &n);

    double pi = 0.0; // 累加和初始化为0
    double pi_1, pi_2, pi_3, pi_4, pi_5;

    for (i = 0; i <= n; i++) {
        pi_1 = 4.0 / ((8 * i) + 1);
        pi_2 = 2.0 / ((8 * i) + 4);
        pi_3 = 1.0 / ((8 * i) + 5);
        pi_4 = 1.0 / ((8 * i) + 6);
        
        // 计算1/16^i
        pi_5 = 1.0;
        for (int j = 0; j < i; j++) {
            pi_5 *= 1.0 / 16;
        }

        // 累加当前项到pi
        pi += (pi_1 - pi_2 - pi_3 - pi_4) * pi_5;
    }

    printf("PI = %.10f\n", pi);
    return 0;
}

简化版本(使用数学库)

可以用pow函数直接计算1/16^i,简化代码:

#include <stdio.h>
#include <math.h>

int main()
{
    int n, i;

    printf("n = ");
    scanf("%d", &n);

    double pi = 0.0;

    for (i = 0; i <= n; i++) {
        double term = (4.0/((8*i)+1) - 2.0/((8*i)+4) - 1.0/((8*i)+5) - 1.0/((8*i)+6)) * pow(16, -i);
        pi += term;
    }

    printf("PI = %.10f\n", pi);
    return 0;
}

注意:使用pow需链接数学库,编译时需添加-lm参数(如gcc pi.c -o pi -lm)。


内容的提问来源于stack exchange,提问作者potato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:11:05