Tôi nhận đoạn mã này từ một số nơi khác. Theo quản trị viên web, mã được chọn từ The art of computer programming by KnuthSự khác biệt trong khoảngEqual và basicEqual trong Nghệ thuật lập trình máy tính
Vì tôi không có bản sao của cuốn sách đó, tôi có thể biết sự khác nhau giữa hai chức năng không?
bool approximatelyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
bool essentiallyEqual(float a, float b, float epsilon)
{
return fabs(a - b) <= ((fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}
Tôi có thể nói, về cơ bảnEqual sẽ luôn cần giá trị 'gần hơn' so với xấp xỉEqual? –
Có, giá trị 'basicEqual' sẽ luôn" gần hơn "so với giá trị' approxEqual'. – palswim
Hãy suy nghĩ về các phiếu mua hàng tại cửa hàng thông thường của bạn và tỷ lệ phần trăm có ý nghĩa như thế nào. Giảm giá 33% có giá trị hơn trong giá hoặc thêm 33% sản phẩm miễn phí là gì? Giải pháp là bạn nên ưu tiên giảm giá 33% vì tương đương với ưu đãi thêm 50% sản phẩm miễn phí. Điều tương tự xảy ra ở đây, tùy thuộc vào việc bạn lấy epsilon xung quanh lớn hơn hoặc nhỏ nhất trong hai giá trị kết quả sẽ khác nhau. 66,6 tương đương 100 với epsilon 33%, nhưng về cơ bản chỉ bằng một epsilon 50%. –