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

基于莱布尼茨级数的圆周率计算代码实现与技术咨询

你的π计算代码分析与改进方案

嘿,我们来一步步拆解你的问题,帮你搞定这个圆周率计算的代码~

一、现有代码的核心问题

你的代码在符号交替的逻辑上是对的,但有个致命的整数除法错误:
1/(2*j-1) 里的1和2*j-1都是整数类型,C语言中整数除法会直接舍弃小数部分,所以除了j=1时结果是1,j>=2时所有项的计算结果都是0,导致最终pi的结果一直停在4.0,完全不符合预期。

另外,代码末尾的return (EXI...应该补全为return EXIT_SUCCESS;——这是stdlib.h里定义的程序正常退出的标准返回值。

二、代码补全与修正版本

先给你修正后的完整代码,解决上述问题,同时优化了循环终止条件:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    double p = 0.0;
    double pi = 0.0;
    int j = 1;
    // 用精度阈值控制循环,比固定次数更合理
    const double tolerance = 1e-6;
    double term;

    do {
        term = 1.0 / (2 * j - 1); // 用1.0触发浮点数除法,避免整数截断
        if (j % 2 == 1) {
            p += term;
        } else {
            p -= term;
        }
        pi = p * 4;
        printf("第%d次迭代,pi近似值:%.8lf\n", j, pi);
        j++;
    } while (term > tolerance); // 当项的绝对值小于阈值时停止循环

    return EXIT_SUCCESS;
}

三、优化建议

  1. 简化符号处理:可以不用if-else判断奇偶,改用一个符号变量每次翻转,代码更简洁:
    double sign = 1.0;
    do {
        term = sign / (2 * j - 1);
        p += term;
        sign *= -1; // 每次迭代翻转符号
        pi = p * 4;
        printf("第%d次迭代,pi近似值:%.8lf\n", j, pi);
        j++;
    } while (term > tolerance);
    
  2. 减少重复计算:把2*j-1的结果存起来,避免每次循环重复运算:
    int denominator;
    do {
        denominator = 2 * j - 1;
        term = sign / denominator;
        // ... 其余代码
    } while (term > tolerance);
    
  3. 改用更快收敛的级数:莱布尼茨级数收敛极慢(要得到10位精度需要约50亿次迭代),如果需要高效计算,可以试试Machin公式:
    π/4 = 4*arctan(1/5) - arctan(1/239)
    arctan用泰勒级数计算时,收敛速度比莱布尼茨级数快得多。
  4. 优化输出逻辑:如果不需要观察每一步的迭代结果,可以只在循环结束后打印最终pi值,减少IO开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:23:11