計算階乘倒數級數: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.0 / s 中的 1.0 是關鍵:若寫成 1 / s,C 語言執行整數除法,結果恆為 0 (s≥2 時),導致 sum 永遠為 1.0。
同階乘級數,遞推計算階乘並直接累加倒數:
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);
}
| n | 級數和 | 與 e-1 差值 | 備註 |
|---|---|---|---|
| 5 | 1.716666... | ~0.0016 | |
| 10 | 1.718281801... | ~2.7e-8 | 單精度 float 極限 |
| 15 | 1.71828182845904... | ~1e-15 | 雙精度 double 極限 |
| 17 | 1.718281828459045... | ~0 | double 完全收斂 |
結論:n ≥ 17 時 double 已達機器精度極限,再增加項數無意義。
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 避免整數除法陷阱;