Đây không thực sự là một vấn đề, nó là một cái gì đó tò mò hơn về số học dấu chấm động trên thực hiện Python.Tại sao phân chia gần bằng không có các hành vi khác nhau trong python?
Ai đó có thể giải thích hành vi sau?
>>> 1/1e-308
1e+308
>>> 1/1e-309
inf
>>> 1/1e-323
inf
>>> 1/1e-324
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero
Dường như 1 chia cho một số gần zero là inf
và nếu nó là gần với một ZeroDivisionError
được ném. Có vẻ như một hành vi kỳ quặc.
Cùng một đầu ra cho trăn 2.x/3.x.
EDIT: Câu hỏi chính của tôi ở đây là lý do tại sao chúng tôi nhận inf
cho một số phạm vi và không ZeroDivisionError
giả python mà dường như để xem xét như zero 1e-309
Điều này hoàn toàn liên quan đến việc triển khai IEEE 754 của Python. Một ngôn ngữ lập trình sane sẽ cho phép sự phân chia xảy ra (bộ xử lý thực hiện nó một cách chính xác, không giống như các nhà thiết kế Python) và tạo ra kết quả thích hợp. Thay vào đó, Python kiểm tra một cách rõ ràng xem ước số có bằng không và hoạt động khác trong trường hợp này. Điều này có chu kỳ bổ sung, không ngăn chặn tràn xảy ra, và có nghĩa là Python không phải là tuân thủ IEEE 754 (kể từ trong IEEE 754 1.0/0.0 sản xuất + inf). –
@PascalCuoq: Về mặt kỹ thuật, điều đó không hoàn toàn đúng, vì bạn sẽ có ngoại lệ với số học IEEE754 * nếu bạn đã bật bẫy *. Vì đó là xa hành vi mặc định, mặc dù, điểm của bạn là hợp lệ, thừa nhận và đáng chú ý. Tuy nhiên, sự khác biệt giữa hai hành vi được giải thích bởi sự đảo ngược của các biến thể cho phép tràn ra được tạo ra, vì vậy tôi không nghĩ rằng câu trả lời cần phải được cải cách. – Dolda2000