泰勒級數展開:
e^x = 1 + x + x^2/2! + x^3/3! + ... + x^n/n! + ...
當項值 |x^n/n!| < ε(如 1e-6)時截斷,累加和即為近似值。
令第 n 項 p_n = x^n/n!,則:
p_0 = 1
p_n = p_{n-1} * x / n
只需一個變數迭代更新,O(n) 時間、O(1) 空間。
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
double x;
cout << "請輸入 x 的值:";
if (!(cin >> x)) return 0;
const double EPS = 1e-6;
double ex = 0.0; // 累加和
double term = 1.0; // 當前項 p_n
int n = 0;
while (fabs(term) > EPS) {
ex += term;
++n;
term = term * x / n; // 遞推計算下一項
}
cout << fixed << setprecision(6);
cout << "e^" << x << " ≈ " << ex << endl;
cout << "標準庫 exp(" << x << ") = " << exp(x) << endl;
cout << "誤差 = " << fabs(ex - exp(x)) << endl;
return 0;
}
請輸入 x 的值:1
e^1.000000 ≈ 2.718282
標準庫 exp(1.000000) = 2.718282
誤差 = 0.000000
term *= x / n 消除階乘與冪次重算,效率極高。fabs(term) > EPS 處理正負 x,確保絕對誤差界。std::exp 驗證精度。template <typename Func>
double taylorSum(double x, Func termGen, double eps = 1e-12) {
double sum = 0, term = termGen(0, x);
for (int n = 0; fabs(term) > eps; ++n) {
sum += term;
term = termGen(n+1, x);
}
return sum;
}
// e^x 專用項生成器
auto expTerm = [](int n, double x) -> double {
static double prev = 1;
if (n == 0) return prev = 1;
return prev *= x / n;
};
無窮級數求值核心在於**遞推關係式**與**收斂條件**。掌握此模式,可輕鬆實作 sin、cos、ln、arctan 等超越函數近似計算。