C++计算n位圆周率算法问题:现有代码输出异常求排查
代码错误分析与修正
你的代码存在两个关键问题,导致输出完全不符合预期:
错误1:整数除法导致累加项失效
C++中,整数与整数执行除法时会触发整数除法,结果会直接截断小数部分。比如1/(2*i+1),当i≥1时分母大于1,计算结果始终为0,这意味着除了第一次循环外,后续的加减操作都不会改变pi的值,累加逻辑完全失效。
解决方法:把分子1改为1.0,强制触发浮点数除法,让计算保留小数部分。
错误2:错误的乘法时机
你使用的是莱布尼茨级数,公式为:
π = 4 × (1 - 1/3 + 1/5 - 1/7 + ... + (-1)^n/(2n+1))
正确逻辑是先完成所有项的累加求和,最后再乘以4得到π值。但你的代码在每次循环内部都执行pi = 4 * pi,相当于每次迭代都把当前结果放大4倍。当n=9时,就是4^9=262144,这就是输出异常的直接原因。
修正后的代码
#include <iostream> #include <iomanip> using namespace std; int main() { double pi = 0; long i; long n; cout << "Enter the value of n: "; cin >> n; cout << endl; for (i = 0; i < n; i++) { // 用1.0触发浮点数除法,保留小数结果 if (i % 2 == 0) pi = pi + (1.0 / (2 * i + 1)); else pi = pi - (1.0 / (2 * i + 1)); } // 循环结束后统一乘以4 pi = 4 * pi; // 用fixed和setprecision控制输出精度,更直观看到收敛过程 cout << endl << "pi = " << fixed << setprecision(10) << pi << endl; return 0; }
修正后,当n=9时会输出3.0170718170,随着n增大,结果会逐渐接近真实的π值(莱布尼茨级数收敛速度较慢,需要很大的n才能得到高精度结果)。
内容的提问来源于stack exchange,提问作者vhT35GPV
相关产品推荐
相关产品推荐

