เปรียบเทียบ 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>)