如何在C++中正确计算指定数学方程的和并解决输出inf的问题
问题分析
你要计算的是双曲余弦函数cosh(1),第一部分用定义式(e^1 + e^{-1})/2的计算是正确的,得到的1.54308是准确结果。第二部分的幂级数展开实现存在多处逻辑错误,才会输出inf。
现有代码的错误点
- 变量
n未初始化就参与阶乘计算,属于未定义行为,fact的初始计算结果完全错误 - 幂级数的循环终止条件错误:你设置了
n<=st,st是计算结果1.54,循环最多执行2次,完全达不到收敛要求 - 级数项的递推逻辑完全错误:
a *= 1.0/ (2 * n)*fact的计算逻辑和cosh(x)的泰勒展开式完全不匹配 - 求和变量
sum用float类型精度不足,容易出现精度误差
修正后的代码
#include <iostream> #include <cmath> // 替换无用的ccomplex,引入M_E的正确头文件 int main() { // 第一部分:用定义式计算cosh(1) double e = M_E; double cosh_def = 1.0/2.0*(e + (1.0/e)); std::cout << "定义式计算结果:" << cosh_def << std::endl; // 第二部分:用泰勒级数计算cosh(1),展开式为 sum_{n=0}^∞ 1/(2n)! double sum = 1.0; // n=0时第一项是1/(0!) = 1 double term = 1.0; // 存储当前项的值 const double eps = 1e-10; // 收敛阈值,项小于这个值就停止迭代 for (int n = 1; ; n++) { // 递推计算下一项:第n项 = 前一项 / (2n*(2n-1)) term /= (2*n) * (2*n -1); if (term < eps) break; // 项足够小,退出循环 sum += term; } std::cout << "级数计算结果:" << sum << std::endl; return 0; }
运行结果
定义式计算结果:1.54308 级数计算结果:1.54308
两个结果完全近似,符合预期。
内容的提问来源于stack exchange,提问作者abl
相关产品推荐
相关产品推荐

