You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用C语言的while循环近似计算π值及代码问题求解

修复你的while循环计算π的代码

首先咱们来梳理下你代码里的几个关键问题,然后一步步修正:

核心问题分析

  • 累加变量被重置:你把double a=0;放在了while循环内部,这样每次循环都会把a清零,根本没法累加所有项的结果,最后只能得到当前单个项乘以4的值,完全达不到近似π的效果。
  • 格式符不匹配printf("%ld",4*a);里,4*a是double类型,但你用了整数格式符%ld,这会导致输出乱码或者错误的数值。
  • pow(-1,n)的问题:用幂函数计算正负交替虽然可行,但效率不高,而且对于大的n可能有精度损耗,其实可以用一个符号变量来交替正负,更高效也更可靠。
  • 循环项的顺序:你的初始n=10,循环从n=10递减到0,虽然数学上加法交换律不影响结果,但通常莱布尼茨级数是从n=0开始累加(第一项是1),不过这个不是错误,只是习惯问题。

修正后的代码

#include <stdio.h>

int main(){
    long n = 0;
    const long max_iterations = 100000; // 迭代次数越多,结果越接近π
    double a = 0.0;
    int sign = 1; // 用符号变量交替正负,代替pow(-1,n)

    while(n < max_iterations){
        a += sign / (2.0 * n + 1.0); // 累加当前项
        sign *= -1; // 切换符号
        n++;
    }

    printf("近似π的值为:%lf\n", 4 * a);
    return 0;
}

代码说明

  1. 把累加变量a移到循环外:这样每次循环都会在之前的结果上累加新的项,最终得到所有项的和。
  2. 用符号变量代替powsign初始为1,每次循环乘以-1,实现正负交替,比pow(-1,n)更高效,也避免了浮点数幂运算的精度问题。
  3. 修正格式符:用%lf来输出double类型的结果,保证输出正确。
  4. 调整循环逻辑:从n=0开始累加,直到达到设定的最大迭代次数,迭代次数越多,结果越接近π(莱布尼茨级数收敛很慢,所以需要较多迭代才能看到接近π的结果,比如10万次)。

如果你坚持要从n=10递减到0的方式,也可以修改成这样:

#include <stdio.h>

int main(){
    long n = 10;
    double a = 0.0;
    int sign = (n % 2 == 0) ? 1 : -1; // 根据初始n的奇偶性设置符号

    while(n >= 0){
        a += sign / (2.0 * n + 1.0);
        sign *= -1;
        n--;
    }

    printf("近似π的值为:%lf\n", 4 * a);
    return 0;
}

不过这个版本因为迭代次数少(只有11次),结果会和π相差较多,建议增加迭代次数来提高精度。

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

火山引擎 最新活动