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

Hàm log1p() trong C++

Hàm log1p() tính logarit tự nhiên của (1 + x) với độ chính xác cao cho x nhỏ. Công thức: log1p(x) = ln(1 + x).

Tại sao cần log1p()?

Tương tự expm1(), khi x rất nhỏ, 1 + x ≈ 1, khiến log(1 + x) mất độ chính xác. log1p() được tối ưu cho trường hợp này.

Cú pháp

float log1p(float x);
double log1p(double x);
long double log1p(long double x);

Miền xác định

  • x > -1 (trả về NaN nếu x ≤ -1)
  • x = -1 → trả về -∞

Ví dụ

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main() {
    cout << fixed << setprecision(6);
    
    double x = 1e-10;
    
    double normal = log(1 + x);
    double accurate = log1p(x);
    
    cout << "x = " << x << endl;
    cout << "log(1+x) = " << normal << endl;
    cout << "log1p(x) = " << accurate << endl;
    
    cout << "\nlog1p(0)   = " << log1p(0) << " (ln 1 = 0)";
    cout << "\nlog1p(1)   = " << log1p(1) << " (ln 2 ≈ 0.693)";
    cout << "\nlog1p(10)  = " << log1p(10) << " (ln 11 ≈ 2.398)" << endl;
    
    return 0;
}

Kết quả

x = 0.0000000001
log(1+x) = 0.0000000001
log1p(x) = 0.0000000001

log1p(0)   = 0.000000 (ln 1 = 0)
log1p(1)   = 0.693147 (ln 2 ≈ 0.693)
log1p(10)  = 2.397895 (ln 11 ≈ 2.398)

Mối quan hệ với expm1()

log1p() và expm1() là cặp hàm nghịch đảo:

  • log1p(expm1(x)) = x
  • expm1(log1p(x)) = x (với x > -1)

Cả hai đều có từ C++11 (<cmath>).