เนื้อหาคล้าย ID 1004082269 แต่ครอบคลุม double ด้วย ใช้ epsilon comparison
ฟังก์ชันสำหรับ Float
bool compare_float(float x, float y, float epsilon = 0.01f) {
return fabs(x - y) < epsilon;
}
ฟังก์ชันสำหรับ Double
bool compare_double(double x, double y, double epsilon = 1e-7) {
return fabs(x - y) < epsilon;
}
ตัวอย่างผลลัพธ์
float: 22/7 vs 3.1415 epsilon=0.01 -> equivalent float: 22/7 vs 3.1415 epsilon=0.001 -> not equivalent double: 2.03547415 vs 2.03547428 epsilon=1e-7 -> not equivalent double: 2.03547415 vs 2.03547428 epsilon=1e-6 -> equivalent
แนวทางที่ดีกว่า (Modern)
- Relative comparison:
fabs(a-b) <= eps * max(fabs(a), fabs(b)) - ULP-based: เปรียบเทียบหน่วยน้อยที่สุดที่แทนได้ (units in last place)
- C++20:
std::is_close(a, b, rel_tol, abs_tol)ใน<cmath>
เลือก epsilon ตาม domain: scientific computing ใช้ relative/ULP, graphics ใช้ absolute epsilon คงที่