Để trực tiếp trả lời câu hỏi của bạn, bạn muốn sử dụng thuật ngữ này epsilon
. Chính xác hơn, đó là machine epsilon
cách sử dụng phổ biến làm giảm "máy" và chỉ sử dụng epsilon
.
Nhìn vào bản sao địa phương của float.h
tôi, tôi thấy:
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define LDBL_EPSILON DBL_EPSILON /* smallest such that 1.0+LDBL_EPSILON != 1.0 */
Và các ý kiến liên quan cho thấy rõ ràng rằng epsilon là thuật ngữ bạn đang đề cập đến.
Nhưng chúng ta cũng có thể dựa vào một số tài liệu tham khảo bên ngoài khác để xác minh đó epsilon
là thuật ngữ chính xác. Xem ở đây , ở đây , ở đây và cuối cùng là sự kết hợp của các thẻ truy vấn SO . Tôi không thể tìm thấy một tài liệu tham khảo trực tiếp đến tiêu chuẩn IEEE 754 để trích dẫn.
Bạn đã không hỏi, nhưng tôi thấy tài liệu tham khảo này rất phù hợp với ví dụ bạn cung cấp để làm rõ câu hỏi của bạn.
Hãy xem bài viết trên blog này của Bruce Dawson của Valve về việc so sánh các giá trị dấu phẩy động để hiểu rõ hơn về lý do tại sao bạn không muốn sử dụng phép so sánh mà bạn đề xuất.
Có khá nhiều thông tin được đóng gói trong bài viết đó, nhưng đây là snipppet có liên quan nhất từ đó:
Nếu so sánh float cho bình đẳng là một ý tưởng tồi thì làm thế nào để kiểm tra xem sự khác biệt của chúng có nằm trong giới hạn lỗi hoặc giá trị epsilon hay không, như sau:
bool isEqual = fabs(f1 – f2) <= epsilon;
Với tính toán này, chúng ta có thể diễn tả khái niệm hai chiếc phao đủ gần để chúng ta muốn coi chúng là bằng nhau. Nhưng giá trị nào chúng ta nên sử dụng cho epsilon?
Với thử nghiệm của chúng tôi ở trên, chúng tôi có thể bị cám dỗ sử dụng lỗi trong tổng của chúng tôi, đó là khoảng 1,19e-7f. Trên thực tế, thậm chí còn có một định nghĩa trong float.h với giá trị chính xác đó và được gọi là FLT_EPSILON.
Rõ ràng đó là nó. Các vị thần tập tin tiêu đề đã nói và FLT_EPSILON là một epsilon thực sự!
Ngoại trừ đó là rác. Đối với các số từ 1.0 đến 2.0 FLT_EPSILON thể hiện sự khác biệt giữa các số float liền kề. Đối với các số nhỏ hơn 1.0, một epsilon của FLT_EPSILON nhanh chóng trở nên quá lớn và với các số đủ nhỏ, FLT_EPSILON có thể lớn hơn các số bạn đang so sánh!
Dawson xem xét khá nhiều cân nhắc khác về những rắc rối liên quan khi so sánh phao và xử lý các giá trị rất nhỏ như thế này, vì vậy tôi sẽ khuyến khích bạn đọc phần còn lại của bài viết của mình.