2013-05-25 57 views
13

Cách tốt nhất để làm toán số nguyên trong 32 và 64-bit, do đó tràn xảy ra như nó trong C?python 32-bit và 64-bit số nguyên toán với tràn ý định

ví dụ: (65536 * 65536 + 1) * (65536 * 65536 + 1) phải là 0x0000000200000001 trong phép toán 64 bit, và không phải giá trị chính xác của nó (không tràn) 0x10000000200000001.

+3

Lỗi tràn đã ký khiến hành vi không xác định trong C, vì vậy, việc nói đúng câu hỏi là vô nghĩa. – Cairnarvon

+0

^lý do khác C không hữu ích cho một số loại tính toán số. :-( –

+0

Tương tự, nhưng không trùng lặp Câu hỏi 32 bit (hoặc 16 bit, mà tôi không hỏi) khác với hành vi int -> dài int. –

Trả lời

19

Chỉ cần & kết quả với mặt nạ 32 hoặc 64 bit thích hợp (0xffffffff hoặc 0xffffffffffffffff).

12

Sử dụng NumPy với kích thước nguyên thích hợp và tràn được hơn C như:

32 bit:

>>> np.uint32(2**32-3) + np.uint32(5) 
__main__:1: RuntimeWarning: overflow encountered in uint_scalars 
2 

64 bit:

>>> i64=np.uint64(65536*65536+1) 
>>> hex(i64*i64) 
'0x200000001L' 

Hãy so sánh với của Python bản địa int:

>>> hex((65536*65536+1)*(65536*65536+1)) 
'0x10000000200000001L' 

Bạn có thể thấy rằng NumPy đang làm như bạn mong muốn.

Các vấn đề liên quan