Hướng dẫn python assert float equal - python khẳng định phao bằng

Sự khôn ngoan phổ biến rằng các số điểm nổi không thể được so sánh với sự bình đẳng là không chính xác. Các số điểm nổi không khác với số nguyên: nếu bạn đánh giá "A == B", bạn sẽ trở thành đúng nếu chúng là số giống hệt nhau và sai (với sự hiểu biết rằng hai NAN tất nhiên không phải là số giống hệt nhau).

Vấn đề thực tế là thế nà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 là giống nhau cho điểm nổi như đối với các 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 cách nào để so sánh các số nguyên cho sự 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à những loại lỗi 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 nhậ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ể cố gắng sử dụng các thuộc tính của các tính toán bạn thực hiện để chứng minh rằng bạn nhận được các lỗi giống nhau trong hai số. Nếu điều đó là khả thi và bạn so sánh hai số xuất phát từ các biểu thức sẽ đưa ra 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 tính toán và chứng minh rằng lỗi không bao giờ vượt quá một lượng nhất định, có thể là một lượng tuyệt đối hoặc một lượng so với 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 toán có khác nhau nhiều nhất không và trả về "đúng" nếu chúng nằm trong khoảng thời gian. Nếu bạn không thể chứng minh 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 nào bạn nhận được trong kết quả.

Tất nhiên, vì chúng tôi chỉ đặt ra yêu cầu bạn nhận được "đúng" nếu kết quả chính xác về mặt toán học là bằng nhau, chúng tôi để lại khả năng bạn nhận được "đúng" ngay cả khi chúng không đồng đều. .

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 đồng đều, 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 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 mục đích thực tế trong nhiều tình huống phổ biến. Vì vậy, chúng ta hãy 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 số chính xác về mặt toán học khác nhau nhiều hơn một số lượng 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 một trò chơi máy tính đã đi, và chúng ta muốn biết liệu nó có đánh một con dơi hay không. Trong trường hợp này, chúng tôi chắc chắn muốn có được "đúng" nếu quả bóng tấn công dơi và chúng tôi muốn nhận được "sai" nếu bóng xa con dơi và chúng tôi có thể chấp nhận câu trả lời "đúng" nếu bóng 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 nằm trong một milimet đá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 vị trí của bóng và vị trí của dơi có lỗi kết hợp nhiều nhất 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 luôn trả lại "sai" nếu bóng và dơi cách nhau hơn một milimet, để trả lại "đúng" nếu chúng chạm vào và trả lại "đúng" nếu chúng đủ gần để được chấp nhận.

Vì vậy, cách bạn quyết định những gì sẽ trở lại khi so sánh các số dấu phẩy động phụ thuộc rất nhiều vào tình huống cụ thể của bạn.

Về cách bạn đi về việc chứng minh giới hạn lỗi để 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ế độ tròn đến gần nhất đều trả về số điểm nổi gần kết quả chính xác cho bất kỳ hoạt động cơ bản nào (đáng chú ý là nhân, phân chia, bổ sung, trừ, căn bậc hai). . Lỗi trong một kết quả duy nhất là tối đa 1/2 giá trị của bit ít có ý nghĩa nhất. (Nếu nó nhiều hơn, việc 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 đáng kể; 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 được 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 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 một sự chậm chạp, vì vậy bạn có thể không biết hoạt động đơn hàng nào được thực hiện.

Có nhiều hơn nữa có thể (và là) đượ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 nào cho so sánh này vì không có giải pháp 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..