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

วิธีที่ดีที่สุดเปรียบเทียบ Float และ Double ใน C/C++

เนื้อหาคล้าย 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 คงที่