Hàm expm1() tính eˣ - 1 với độ chính xác cao cho giá trị x nhỏ. Công thức: expm1(x) = eˣ - 1.
Tại sao cần expm1()?
Khi x rất nhỏ (gần 0), exp(x) ≈ 1, phép trừ exp(x) - 1 gây mất độ chính xác do hiệu hai số gần nhau (catastrophic cancellation). expm1() giải quyết vấn đề này.
Cú pháp
float expm1(float x); double expm1(double x); long double expm1(long double x);
Ví dụ
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
cout << fixed << setprecision(6);
double x = 1e-10; // Rất nhỏ
// Cách thông thường - mất độ chính xác
double normal = exp(x) - 1;
// Cách chính xác
double accurate = expm1(x);
cout << "x = " << x << endl;
cout << "exp(x) - 1 = " << normal << endl;
cout << "expm1(x) = " << accurate << endl;
// Ví dụ giá trị lớn hơn
cout << "\nexpm1(1) = " << expm1(1) << " (e - 1 ≈ 1.71828)";
cout << "\nexpm1(10) = " << expm1(10) << endl;
return 0;
}
Kết quả
x = 0.0000000001 exp(x) - 1 = 0.0000000001 expm1(x) = 0.0000000001 expm1(1) = 1.718282 (e - 1 ≈ 1.71828) expm1(10) = 22025.465795
Lưu ý
- Có sẵn từ C++11 (
<cmath>) - Hàm ngược:
log1p(x)tính ln(1+x) - Dùng trong tài chính, thống kê, mô hình tăng trưởng