ฟังก์ชัน log1p() คืออะไร?
ฟังก์ชัน log1p() คำนวณ natural logarithm ของ (1 + x) คือ log(1 + x) โดยมีความแม่นยำสูงสำหรับค่า x ใกล้ 0
Syntax
#include <cmath> double log1p(double x); float log1pf(float x); long double log1pl(long double x);
ทำไมต้องใช้ log1p() แทน log(1+x)?
เมื่อ x เล็กมาก (เช่น 1e-10) การคำนวณ 1 + x ใน floating-point จะสูญเสีย precision (catastrophic cancellation) เพราะ 1 และ x ต่างออเดอร์มาก ทำให้ log(1+x) ไม่แม่นยำ
log1p(x) คำนวณโดยตรงด้วยอัลกอริทึมพิเศษที่รักษา precision สำหรับ x ใกล้ 0
ตัวอย่างการใช้งาน
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double x = 20.34;
double result = log1p(x);
cout << fixed << setprecision(5);
cout << "log1p(" << x << ") = " << result << endl;
x = 0.0;
result = log1p(x);
cout << "log1p(" << x << ") = " << result << endl;
// ทดสอบ precision สำหรับค่าเล็ก
double small = 1e-10;
cout << "log(1+" << small << ") = " << log(1 + small) << endl;
cout << "log1p(" << small << ") = " << log1p(small) << endl;
cout << "Expected: " << small << " (since log(1+x) ≈ x for small x)" << endl;
return 0;
}
ผลลัพธ์
log1p(20.34) = 3.06058 log1p(0.00000) = 0.00000 log(1+1e-10) = 0.00000 log1p(1e-10) = 0.00000 Expected: 1e-10 (since log(1+x) ≈ x for small x)
หมายเหตุ: การแสดงผลอาจปัดเศษ แต่ log1p คำนวณภายในแม่นยำกว่า
Domain และ Range
- Domain: x > -1 (หาก x = -1 → log(0) = -inf, x < -1 → NaN)
- Range: (-∞, +∞)
ฟังก์ชันเกี่ยวข้อง
| ฟังก์ชัน | คำนวณ | ใช้เมื่อ |
|---|---|---|
| log1p(x) | ln(1+x) | x ใกล้ 0 |
| expm1(x) | e^x - 1 | x ใกล้ 0 |
| log10(x) | log10(x) | log base 10 |
| log2(x) | log2(x) | log base 2 |