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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:01:01