2011-09-26 22 views
28

Tôi mới tham gia lập trình. Trong dự án 2,7 Python mới nhất của tôi, tôi gặp phải như sau:Python RuntimeWarning: gặp phải tình trạng tràn trong các vô hướng dài

RuntimeWarning: tràn gặp phải trong long_scalars

Có thể ai đó xin hãy giải thích điều này có nghĩa và những gì tôi có thể làm gì để khắc phục điều đó?

Mã chạy qua, nhưng tôi không chắc liệu bạn có nên bỏ qua cảnh báo hay không.

Nó xảy ra trong một quá trình append như:

SomeList.append(VeryLongFormula) 
+3

Bạn có vui lòng cho một [ngắn, ví dụ hoàn chỉnh] (http://sscce.org/) đó chứng tỏ vấn đề này ? –

+2

Bạn đã bao gồm thẻ numpy. Không có gì trong câu hỏi của bạn cho thấy gumpy. Bạn chưa bao gồm mã cho phép chúng tôi tạo lại lỗi. Xin hãy làm như vậy. –

+0

có thể trùng lặp của http://stackoverflow.com/questions/3767409/python-warning-possibly-numpy – rocksportrocker

Trả lời

33

Dưới đây là một ví dụ mà vấn đề cảnh báo tương tự:

import numpy as np 
np.seterr(all='warn') 
A = np.array([10]) 
a=A[-1] 
a**a 

sản lượng

RuntimeWarning: overflow encountered in long_scalars 

Trong ví dụ trên nó xảy ra vì a là của dtype int32 và v maximim alue storable in an int32 là 2 ** 31-1. Kể từ 10**10 > 2**32-1, kết quả lũy thừa trong một số lớn hơn số có thể được lưu trữ trong một số int32.

Lưu ý rằng bạn không thể dựa vào np.seterr(all='warn') để bắt tất cả các lỗi tràn lỗi bị lỗi. Ví dụ, trên 32-bit NumPy

>>> np.multiply.reduce(np.arange(21)+1) 
-1195114496 

trong khi trên 64-bit NumPy:

>>> np.multiply.reduce(np.arange(21)+1) 
-4249290049419214848 

Cả hai thất bại mà không cần bất kỳ cảnh báo, mặc dù nó cũng là do một lỗi tràn bộ nhớ. Câu trả lời đúng là 21! bằng

In [47]: import math 

In [48]: math.factorial(21) 
Out[50]: 51090942171709440000L 

According to numpy developer, Robert Kern,

Không giống như lỗi dấu chấm động đúng (nơi FPU phần cứng đặt một lá cờ bất cứ khi nào nó một hoạt động nguyên tử mà tràn), chúng ta cần phải thực hiện việc phát hiện tràn số nguyên chính chúng ta. Chúng tôi làm điều đó trên các số vô hướng , nhưng không phải mảng vì sẽ quá chậm để triển khai cho mọi hoạt động nguyên tử trên mảng.

Vì vậy, gánh nặng là bạn chọn thích hợp dtypes sao cho không có hoạt động tràn.

+2

Cảm ơn! Làm thế nào để xác định loại dtype tôi muốn? – timkado

+3

Bạn có thể đặt 'dtype' khi tạo mảng numpy. Ví dụ, trong ví dụ trên, bạn có thể tránh lỗi tràn bằng cách thiết lập: 'A = np.array ([10], dtype = 'int64')' – unutbu

+2

Đây là [danh sách các kiểu cơ bản] (http: // docs.scipy.org/doc/numpy/user/basics.types.html#data-types). – unutbu

0

Một cách dễ dàng để khắc phục vấn đề này là sử dụng 64 bit loại

list = numpy.array(list, dtype=numpy.float64)