Sự khôn ngoan phổ biến rằng các số dấu phẩy động không thể so sánh được cho đẳng thức là không chính xác. Số dấu phẩy động không khác với số nguyên: Nếu bạn đánh giá "a == b", bạn sẽ nhận được đúng nếu chúng là số giống nhau và sai khác (với cách hiểu rằng hai NaN tất nhiên không phải là số giống nhau).
Vấn đề thực tế là đây: Nếu tôi đã thực hiện một số tính toán và không chắc hai số tôi phải so sánh là chính xác, thì sao? Vấn đề này tương tự đối với dấu phẩy động giống như đối với số nguyên. Nếu bạn đánh giá biểu thức số nguyên "7/3 * 3", nó sẽ không so sánh bằng "7 * 3/3".
Vì vậy, giả sử chúng tôi hỏi "Làm thế nào để tôi so sánh các số nguyên cho bình đẳng?" trong tình huống như vậy Không có câu trả lời duy nhất; những gì bạn nên làm phụ thuộc vào tình huống cụ thể, đáng chú ý là loại lỗi nào bạn có và những gì bạn muốn đạt được.
Dưới đây là một số lựa chọn có thể.
Nếu bạn muốn có kết quả "đúng" nếu các số chính xác về mặt toán học sẽ bằng nhau, thì bạn có thể thử sử dụng các thuộc tính của các phép tính bạn thực hiện để chứng minh rằng bạn có cùng một lỗi trong hai số. Nếu điều đó là khả thi và bạn so sánh hai số kết quả từ các biểu thức sẽ cho các số bằng nhau nếu được tính toán chính xác, thì bạn sẽ nhận được "đúng" từ so sánh. Một cách tiếp cận khác là bạn có thể phân tích các thuộc tính của các phép tính và chứng minh rằng lỗi không bao giờ vượt quá một số tiền nhất định, có thể là một số tiền tuyệt đối hoặc một số tiền liên quan đến một trong các đầu vào hoặc một trong các đầu ra. Trong trường hợp đó, bạn có thể hỏi liệu hai số được tính có khác nhau nhiều nhất không và trả về "true" nếu chúng nằm trong khoảng. Nếu bạn không thể chứng minh một lỗi bị ràng buộc, bạn có thể đoán và hy vọng điều tốt nhất. Một cách đoán là đánh giá nhiều mẫu ngẫu nhiên và xem loại phân phối bạn nhận được trong kết quả.
Tất nhiên, vì chúng tôi chỉ đặt yêu cầu là bạn phải "đúng" nếu kết quả chính xác về mặt toán học bằng nhau, chúng tôi bỏ ngỏ khả năng bạn nhận được "đúng" ngay cả khi chúng không bằng nhau. (Trên thực tế, chúng ta có thể đáp ứng yêu cầu bằng cách luôn trả về "true". Điều này làm cho phép tính đơn giản nhưng thường không mong muốn, vì vậy tôi sẽ thảo luận về việc cải thiện tình huống bên dưới.)
Nếu bạn muốn nhận được kết quả "sai" nếu các số chính xác về mặt toán học sẽ không bằng nhau, bạn cần chứng minh rằng đánh giá của bạn về các số mang lại các số khác nhau nếu các số chính xác về mặt toán học sẽ không bằng nhau. Điều này có thể là không thể cho các mục đích thực tế trong nhiều tình huống phổ biến. Vì vậy, hãy để chúng tôi xem xét một sự thay thế.
Một yêu cầu hữu ích có thể là chúng ta nhận được kết quả "sai" nếu các con số chính xác về mặt toán học khác nhau nhiều hơn một số tiền nhất định. Ví dụ, có lẽ chúng ta sẽ tính toán nơi một quả bóng ném trong trò chơi máy tính đi qua, và chúng ta muốn biết liệu nó có đánh một con dơi không. Trong trường hợp này, chúng tôi chắc chắn muốn nhận được "đúng" nếu quả bóng đập vào người dơi và chúng tôi muốn nhận được "sai" nếu quả bóng cách xa con dơi và chúng tôi có thể chấp nhận câu trả lời "không đúng" nếu quả bóng rơi vào một mô phỏng chính xác về mặt toán học đã bỏ lỡ con dơi nhưng chỉ trong một milimet khi đánh con dơi. Trong trường hợp đó, chúng tôi cần chứng minh (hoặc đoán / ước tính) rằng tính toán của chúng tôi về vị trí của quả bóng và vị trí của người dơi có lỗi kết hợp tối đa là một milimet (cho tất cả các vị trí quan tâm). Điều này sẽ cho phép chúng tôi luôn trở về "
Vì vậy, cách bạn quyết định trả lại những gì khi so sánh các số có dấu phẩy động phụ thuộc rất nhiều vào tình huống cụ thể của bạn.
Đối với cách bạn đi về việc chứng minh giới hạn lỗi cho các tính toán, đó có thể là một chủ đề phức tạp. Bất kỳ triển khai điểm nổi nào sử dụng tiêu chuẩn IEEE 754 ở chế độ từ tròn đến gần nhất đều trả về số dấu phẩy động gần nhất với kết quả chính xác cho bất kỳ thao tác cơ bản nào (đáng chú ý là nhân, chia, cộng, trừ, căn bậc hai). (Trong trường hợp hòa, làm tròn nên bit thấp là chẵn.) (Đặc biệt cẩn thận về căn bậc hai và phép chia; việc triển khai ngôn ngữ của bạn có thể sử dụng các phương thức không phù hợp với IEEE 754 cho những điều đó.) Vì yêu cầu này, chúng tôi biết lỗi trong một kết quả duy nhất nhiều nhất bằng 1/2 giá trị của bit có trọng số thấp nhất. (Nếu nhiều hơn, số làm tròn sẽ chuyển sang một số khác trong phạm vi 1/2 giá trị.)
Tiếp tục từ đó trở nên phức tạp hơn nhiều; bước tiếp theo là thực hiện một thao tác trong đó một trong các đầu vào đã có một số lỗi. Đối với các biểu thức đơn giản, các lỗi này có thể được theo dõi thông qua các tính toán để đạt đến một ràng buộc về lỗi cuối cùng. Trong thực tế, điều này chỉ được thực hiện trong một vài tình huống, chẳng hạn như làm việc trên một thư viện toán học chất lượng cao. Và, tất nhiên, bạn cần kiểm soát chính xác đối với chính xác các hoạt động được thực hiện. Các ngôn ngữ cấp cao thường cung cấp cho trình biên dịch rất nhiều sự chậm chạp, do đó bạn có thể không biết các thao tác theo thứ tự nào được thực hiện.
Có nhiều hơn nữa có thể (và) được viết về chủ đề này, nhưng tôi phải dừng lại ở đó. Tóm lại, câu trả lời là: Không có thói quen thư viện cho việc so sánh này bởi vì không có giải pháp duy nhất nào phù hợp với hầu hết các nhu cầu đáng để đưa vào thói quen thư viện. (Nếu so sánh với một khoảng thời gian lỗi tương đối hoặc tuyệt đối đủ cho bạn, bạn có thể làm điều đó một cách đơn giản mà không cần một thói quen thư viện.)