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

C++计算幂级数时控制台输出nan的问题该如何解决?

错误原因

  • 阶乘溢出:你用long类型存储阶乘f,32位long的最大值仅为2^31-1≈2e9,当k≥20时,阶乘结果已经远超long的取值范围,发生整数溢出,f会变成无效值(负数、乱码值),后续除法运算就会产生nan。
  • 冗余计算:每次循环调用pow计算幂次的写法效率低,也容易引入精度误差。

解决方法

不用单独计算阶乘和高次幂,改用递推的方式计算每一项的累加值,既避免溢出,也能提升计算效率:

#include <iostream>
#include <cmath>
using namespace std;

double s(double x) {
    double base = (x - 1) * log(3); // 提取公共因子
    double term = 1.0; // 级数第0项的值
    double res = term;
    // 递推规则:第k项 = 第k-1项 * base / k
    for(int k = 1; k <= 100; k++) {
        term *= base / k;
        res += term;
        // 可选优化:当项的精度足够小时提前结束循环
        if(fabs(term) < 1e-15) break;
    }
    return res;
}

int main() {
    double a = 0.2, b = 0.8, h;
    h = (b - a) / 10;
    // 加极小阈值避免浮点数累加误差漏掉最后一个x值
    for(double x = a; x <= b + 1e-8; x += h) {
        cout << "x=" << x << ", s(x)=" << s(x) << endl;
    }
    return 0;
}

额外说明

你实现的这个级数本身就是3^(x-1)的泰勒展开,如果你不需要练习级数实现,也可以直接调用库函数pow(3, x-1)直接得到完全一致的计算结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:15:04