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

