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
相关产品推荐
相关产品推荐

