Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ฟังก์ชัน log1p() ใน C++

ฟังก์ชัน 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() เป็นฟังก์ชันสำคัญสำหรับ numerical stability เมื่อคำนวณ log(1+x) สำหรับ x ใกล้ 0 เป็นส่วนหนึ่งของ math library มาตรฐาน C99/C++11 ควรใช้แทน log(1+x) เมื่อ x มีขนาดเล็ก

ฟังก์ชันคำนวณใช้เมื่อ
log1p(x)ln(1+x)x ใกล้ 0
expm1(x)e^x - 1x ใกล้ 0
log10(x)log10(x)log base 10
log2(x)log2(x)log base 2