首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言練習:階乘倒數級數求和 1/1! + 1/2! + 1/3! + ... + 1/n! (逼近 e-1)

     編輯:關於C語言

問題描述

計算階乘倒數級數:f = 1/1! + 1/2! + 1/3! + ... + 1/n!。此級數單調遞增且收斂,極限為 e - 1 ≈ 1.718281828...,是驗證浮點精度、理解自然常數 e 定義的絕佳案例。

基礎實現

#include <stdio.h>

void f(int m);

int main() {
    int n;
    printf("請輸入一個數(不能太大): ");
    scanf("%d", &n);
    f(n);
    return 0;
}

void f(int m) {
    int i, j;
    int s = 1;
    double sum = 0.0;   // 必須用浮點型

    for (i = 1; i <= m; i++) {
        s = 1;
        for (j = 1; j <= i; j++) {
            s *= j;
        }
        sum += 1.0 / s;   // 1.0 強制浮點除法
        s = 1;
    }
    printf("%lf\n", sum);
}

核心技術點解析

1. 浮點除法強制轉換

1.0 / s 中的 1.0 是關鍵:若寫成 1 / s,C 語言執行整數除法,結果恆為 0 (s≥2 時),導致 sum 永遠為 1.0。

2. 遞推優化:O(n²) → O(n)

同階乘級數,遞推計算階乘並直接累加倒數:


void f_optimized(int m) {
    double fact = 1.0, sum = 0.0;
    for (int i = 1; i <= m; i++) {
        fact *= i;          // 遞推階乘
        sum += 1.0 / fact;  // 累加倒數
    }
    printf("優化版: %.10f\n", sum);
}

3. 收斂速度與精度分析

n級數和與 e-1 差值備註
51.716666...~0.0016
101.718281801...~2.7e-8單精度 float 極限
151.71828182845904...~1e-15雙精度 double 極限
171.718281828459045...~0double 完全收斂

結論:n ≥ 17 時 double 已達機器精度極限,再增加項數無意義。

數學背景:自然常數 e 的級數定義

e = Σk=0∞ 1/k! = 1 + 1/1! + 1/2! + 1/3! + ...
本級數 = e - 1 = Σk=1∞ 1/k!。

這是計算 e 的最高效級數之一(收斂極快),廣泛用於科學計算庫實現 exp(x) 的基礎(通過泰勒展開)。

工程化增強版:自適應精度停止


#include <stdio.h>
#include <math.h>
#include <float.h>

void compute_e_minus_1() {
    double fact = 1.0, sum = 0.0, term;
    int i = 1;

    do {
        fact *= i;
        term = 1.0 / fact;
        sum += term;
        i++;
        // 當項值小於機器 epsilon 相對當前和時停止
    } while (term > sum * DBL_EPSILON);

    printf("計算項數: %d\n", i-1);
    printf("級數和: %.15f\n", sum);
    printf("理論值 e-1: %.15f\n", M_E - 1.0);
    printf("誤差: %e\n", fabs(sum - (M_E - 1.0)));
}

總結

階乘倒數級數是「浮點精度、收斂判斷、數學常數計算」的綜合練習。關鍵收穫:

  • 強制浮點除法 1.0/s 避免整數除法陷阱;
  • 遞推優化將 O(n²) 降為 O(n);
  • 理解級數收斂於 e-1,n=17 即達 double 極限;
  • 掌握自適應停止條件(項值 < 當前和 × 機器 epsilon)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved