Ấn tượng ngây thơ của tôi là người ta sẽ luôn kiểm tra sự khác biệt so với một số epsilon khoan dung. Tôi có lầm không? Có thể kiểm tra sự bình đẳng của phao có ý nghĩa trong các bối cảnh nhất định?
Không có một công thức nấu ăn độc đáo. Trong bài viết này có một điều trị toàn diện, nơi bạn có thể tìm thấy một câu trả lời hoàn chỉnh với kỹ thuật và mã.
Tóm lại, chủ yếu có 3 trường hợp:
- so sánh với không
- so sánh với số không
- so sánh hai số tùy ý
Ý tưởng của bạn để sử dụng so sánh với dung sai là tốt cho một số trường hợp, nhưng cũng có một kỹ thuật dựa trên Đơn vị ở vị trí cuối cùng ( ULP ), được mô tả trong bài viết
Tôi mặc nhiên cho rằng sử dụng toán tử đẳng thức trên phao thực sự có ý nghĩa trong một số bối cảnh; mặt khác tại sao hầu hết các ngôn ngữ lập trình sẽ cho phép nó.
Như trên, có những tình huống bạn có thể sử dụng nó, nhưng được cảnh báo. Ví dụ, trình biên dịch gcc có cảnh báo:
warning: comparing floating point with == or != is unsafe
Cập nhật
Tôi thêm một số cân nhắc ở trên lập luận này, họ cũng không liên quan chặt chẽ đến vụ án a == b
.
Bình đẳng với biểu thức
Xem xét trường hợp:
a + b == c
a b c
một ⊕ bfl ( fl (a)+ fl (b))= = c= = fl (c)
|||mộta + b|||e r rmột+ |||ba + b|||e r rb
e r rx= | x - fl (x)|| x |
Vì vậy, trong trường hợp này có sử dụng ==
là tinh tế hơn.
Chuyển trong các môi trường khác nhau
Khi chúng tôi chuyển mã trong các môi trường khác nhau (máy khác nhau), chúng tôi có thể nhận được một số kết quả khác nhau (ví dụ: thử suy nghĩ để kiểm tra đơn vị). Ngoài ra trong trường hợp sử dụng ==
là tinh tế.