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

การเปรียบเทียบ Floating Point ใน C++

เปรียบเทียบ float/double ต้องใช้ epsilon (ค่าความคลาดเคลื่อนที่ยอมรับได้) ไม่ใช่ == โดยตรง

ฟังก์ชันเปรียบเทียบ

bool compare_float(float x, float y, float epsilon = 0.01f) {
    return fabs(x - y) < epsilon;
}

ตัวอย่าง

float x = 22.0f/7.0f; // ~3.142857
float y = 3.1415f;

compare_float(x, y);       // true (diff ~0.0013 < 0.01)
compare_float(x, y, 0.001f); // false (diff > 0.001)

double a = 2.03547415, b = 2.03547428;
compare_float(a, b, 1e-7); // true (diff ~1.3e-7 < 1e-7? false)
compare_float(a, b, 1e-6); // true

Best Practices

  • Relative epsilon สำหรับค่ากว้าง: fabs(a-b) <= epsilon * max(fabs(a), fabs(b))
  • ULP-based comparison สำหรับความแม่นยำสูงสุด
  • C++20: std::is_close() (ใน <cmath>)