2015-08-14 29 views
9

Có chủ yếu là sử dụng python, tôi đã nhận được hư hỏng bởi không phải lo lắng về tràn số nguyên. Bây giờ tôi đang sử dụng numpy, tôi phải lo lắng về nó một lần nữa. Tôi muốn numpy để lỗi trong trường hợp tràn, nhưng nó không có vẻ làm việc cho int64.Nhận numpy để cảnh báo về tràn số nguyên

import numpy 
numpy.seterr(all='raise') 
print("{:,}".format(numpy.prod([10]*50))) 
# -5,376,172,055,173,529,600 
print("{:,}".format(numpy.int64(3200000000) * numpy.int64(3200000000))) 
# -8,206,744,073,709,551,616 
print("{:,}".format(numpy.int32(320000) * numpy.int32(320000))) 
# FloatingPointError: overflow encountered in int_scalars -- Finally getting an error! 

tôi luôn luôn có thể thêm dtype=object để sửa chữa những vấn đề này, nhưng tôi sẽ nghĩ Int64 là đủ tốt hầu hết thời gian, nó chỉ là đáng sợ rằng nó có thể thất bại trong khó khăn này để phát hiện cách.

Tại sao seterr chỉ hoạt động cho int32? Tôi có thể làm cho nó làm việc cho int64?

Phần duy nhất của numpy.seterr tài liệu mà tôi có thể tìm thấy trong đó có thể gợi ý tại sao điều này có thể là trường hợp là những đoạn văn ngắn sau:

Lưu ý rằng hoạt động trên nguyên kiểu vô hướng (ví dụ như int16) là được xử lý như điểm nổi và bị ảnh hưởng bởi các cài đặt này.

Nhưng không có gì trong tài liệu data type sẽ gợi ý rằng int32 và int64 bằng cách nào đó khác biệt về khái niệm. Không chắc chắn nếu int64 không được coi là một "loại vô hướng số nguyên".

+3

Trông giống như một lỗi nặng nề; xem https://github.com/numpy/numpy/pull/3199. Oddly đủ, in (numpy.int64 (2 ** 63-1) * numpy.int64 (2)) * không * nâng cao một ngoại lệ trên hệ thống của tôi (Ubuntu 14.04, Python 2.7.6, numpy 1.8.2), nhưng ví dụ cho thấy hành vi lỗi. –

Trả lời

2

Thật vậy, hành vi dường như phụ thuộc vào kích thước của loại int. Dưới đây là danh sách bao gồm trường hợp của bạn và thêm một số chi tiết khác (có thiết lập numpy.seterr(all='raise')).

In [25]: numpy.int(3200000000) * numpy.int(3200000000) 
Out[25]: 10240000000000000000 

In [26]: numpy.int8(3200000000) * numpy.int8(3200000000) 
Out[26]: 0 

In [27]: numpy.int16(3200000000) * numpy.int16(3200000000) 
--------------------------------------------------------------------------- 
FloatingPointError      Traceback (most recent call last) 
<ipython-input-27-a6185c9da0fd> in <module>() 
----> 1 numpy.int16(3200000000) * numpy.int16(3200000000) 

FloatingPointError: overflow encountered in short_scalars 

In [28]: numpy.int32(3200000000) * numpy.int32(3200000000) 
--------------------------------------------------------------------------- 
FloatingPointError      Traceback (most recent call last) 
<ipython-input-28-a3909399b44a> in <module>() 
----> 1 numpy.int32(3200000000) * numpy.int32(3200000000) 

FloatingPointError: overflow encountered in int_scalars 

In [29]: numpy.int64(3200000000) * numpy.int64(3200000000) 
Out[29]: -8206744073709551616 
Các vấn đề liên quan