Đó là bởi vì nó sử dụng C int chứ không phải số nguyên Python nên nó phù hợp với hành vi C hơn là hành vi Python. Tôi tương đối chắc chắn điều này từng được ghi nhận là một giới hạn ở đâu đó nhưng tôi không thể tìm thấy nó ngay bây giờ. Nếu bạn muốn báo cáo đó là một lỗi, hãy truy cập https://github.com/cython/cython/issues , nhưng tôi nghi ngờ đây là sự đánh đổi có chủ ý về tốc độ để tương thích.
Mã được dịch sang
__Pyx_pow_long(2, -1L)
trong đó __Pyx_pow_long
là một chức năng của loại static CYTHON_INLINE long __Pyx_pow_long(long b, long e)
.
Cách dễ nhất để khắc phục là thay đổi một / cả hai số thành số dấu phẩy động
print(2. ** (-1))
Như một nhận xét chung về lựa chọn thiết kế: mọi người từ thế giới C thường mong đợi được int operator int
trả lại int
và tùy chọn này sẽ nhanh nhất. Python đã cố gắng làm điều này trong quá khứ với hành vi phân chia Python 2 (nhưng không nhất quán - sức mạnh luôn trả về một số dấu phẩy động).
Cython thường cố gắng theo dõi hành vi của Python. Tuy nhiên, rất nhiều người đang sử dụng nó cho tốc độ nên họ cũng cố gắng quay lại các thao tác nhanh, giống như C, đặc biệt là khi mọi người chỉ định loại (vì những người đó muốn tốc độ). Tôi nghĩ những gì đã xảy ra ở đây là nó có thể tự động suy ra các loại và do đó được mặc định là hành vi C. Tôi nghi ngờ lý tưởng là nó nên phân biệt giữa các loại được chỉ định và các loại mà nó được suy ra. Tuy nhiên, có lẽ cũng đã quá muộn để bắt đầu thay đổi điều đó.
language_level
đã thiết lập phiên bản Python mà bạn đang biên dịch chưa? (Sự không nhất quán có thể là một lỗi ngay cả khi bạn có sự không phù hợp giữalanguage_level
phiên bản Python và phiên bản Python của bạn, nhưng thông tin này rất quan trọng để chẩn đoán sự cố.)