C语言计算e的近似值:级数展开与溢出处理

码头散步
码头散步
发布时间:2026-10-15 | 4人浏览过
原创

本文讲解利用C语言通过阶乘级数计算自然常数e的近似值方法,重点解决输入n较大时阶乘导致的整数溢出问题,并提供基于精度判断的优化代码实现。

问题分析与算法原理

自然常数 e 可以通过以下无穷级数进行近似计算:

e ≈ 1 + 1/1! + 1/2! + ⋯ + 1/n! + ⋯

题目要求对给定的非负整数 n,求该级数前 n+1 项的和(从第0项 1/0! 开始)。通常输入约束为 n ≤ 1000,输出需保留小数点后八位。

常规实现与溢出风险

最直接的方法是先计算每一项的分母 i!,再累加 1/i!。然而,当 n 较大时(如接近1000),n! 的值会迅速超过 long long int 等整型变量的存储范围,导致数据溢出,从而得到错误的结果。

优化策略:基于精度的截断

要解决溢出问题,需观察输出的精度要求:保留小数点后八位。这意味着当某一项 1/n! 的值小于 0.00000001(即 1e-8)时,该项对最终结果保留八位小数的数值影响微乎其微,甚至不会引起最后一位的进位变化。

  • 事实上,当 m = 1/n! ≤ 0.00000001 时,后续项更小,可直接终止循环。
  • 在 n 达到溢出阈值之前,级数各项的值通常会先降到精度允许的最小误差范围内。因此,加入 if (m <= 1e-8) break; 判断,既能避免大数运算导致的溢出,又能保证计算效率。

C语言代码实现

以下是经过优化的C语言代码,使用 double 类型直接维护当前项的值,避免显式计算巨大的阶乘分母。

#include <stdio.h>

int main() {
    int n;
    double sum = 1.0;      // 初始和,包含第一项 1/0! = 1
    double item = 1.0;     // 当前项的值,初始为 1/0!
    
    scanf("%d", &n);
    
    if (n >= 0 && n <= 1000) {
        for (int i = 1; i <= n; i++) {
            // 更新当前项:item_new = item_old / i
            // 因为 1/i! = 1/(i-1)! / i
            item /= i;
            sum += item;
            
            // 如果当前项小到不影响第八位小数精度,则提前结束
            if (item < 0.00000001) {
                break;
            }
        }
        printf("%.8lf\n", sum);
    }
    return 0;
}

运行结果示例

当输入 10 时,程序输出部分和并保留八位小数,结果如下:

对于较大的 n 值,优化后的代码依然能正确输出稳定的近似值,不会出现乱码或错误数值:

对比未处理溢出或普通实现的潜在报错界面:

最终稳定输出的标准格式验证:

总结

以上就是利用C语言通过级数展开求e的近似值的详细内容。关键在于理解浮点精度截断可以有效规避阶乘带来的整数溢出问题。更多关于C语言算法优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表