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)) = xexpm1(log1p(x)) = x(với x > -1)
Cả hai đều có từ C++11 (<cmath>).