Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm expm1() trong C++

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