2011-09-26 13 views
28

Jestem nowy w programowaniu. W swoim najnowszym projekcie Python 2.7 I napotkał następujący:Python RuntimeWarning: przepełnienie napotkane w długich skalarach

RuntimeWarning: przepełnienie napotkany w long_scalars

Może ktoś proszę opracować, co to oznacza i co mogę zrobić, aby to naprawić?

Kod przechodzi, ale nie jestem pewien, czy dobrze jest po prostu zignorować ostrzeżenie.

Zdarza się podczas procesu dopisywania jak:

SomeList.append(VeryLongFormula) 
+3

Mógłbyś pokazać [krótki, pełny przykład] (http://sscce.org/), który pokazuje ten problem ? –

+2

Zawarłeś tag numpy. Nic w twoich pytaniach nie sugeruje odrętwienia. Nie podałeś kodu, który pozwala nam odtworzyć błąd. Zrób tak, proszę. –

+0

możliwy duplikat http://stackoverflow.com/questions/3767409/python-warning-possibly-numpy – rocksportrocker

Odpowiedz

33

Oto przykład, który emituje taką samą ostrzeżenie:

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

plony

RuntimeWarning: overflow encountered in long_scalars 

W powyższym przykładzie to się dzieje, ponieważ a jest dtype int32, a maksyma v Zapis alue w pliku int32 to 2 ** 31-1. Od 10**10 > 2**32-1, potęgowanie skutkuje liczbą większą niż ta, którą można zapisać w postaci int32.

Należy pamiętać, że nie można polegać na np.seterr(all='warn'), aby uchwycić wszystkie błędy przepełnienia w numpy. Na przykład, na 32-bitowym NumPy

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

natomiast na 64-bitowym NumPy:

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

Zarówno zawieść bez żadnego ostrzeżenia, chociaż jest to również z powodu błędu przepełnienia. Prawidłowa odpowiedź jest taka, że ​​21! równa

In [47]: import math 

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

According to numpy developer, Robert Kern,

przeciwieństwie do prawdziwych błędów zmiennoprzecinkowych (gdzie FPU sprzętu ustawia flagę kiedy robi operację atomową, która przelewa), musimy wdrożyć wykrywanie całkowitą przepełnienia my sami. Robimy to na skalarach , ale bez tablic, ponieważ byłoby zbyt wolne, aby zaimplementować dla każdej operacji atomowej na tablicach.

Tak więc obciążenie polega na tym, aby wybrać odpowiedni dtypes, aby żadna operacja nie była przepełniona.

+2

Dzięki! Jak zdefiniować, jakiego typu dtype chcę? – timkado

+3

Możesz ustawić 'dtype' podczas tworzenia tablicy numpy. Na przykład w powyższym przykładzie można uniknąć błędu przepełnienia, ustawiając: 'A = np.array ([10], dtype = 'int64')' – unutbu

+2

Oto [lista podstawowych dtypów] (http: // docs.scipy.org/doc/numpy/user/basics.types.html#data- typeses). – unutbu

0

Łatwym sposobem rozwiązania tego problemu jest użycie 64 bitowy typ

list = numpy.array(list, dtype=numpy.float64) 
Powiązane problemy