Python RuntimeWarning: débordement rencontré dans les scalaires longs
Je suis nouveau à la programmation. Dans mon dernier projet Python 2.7, j'ai rencontré ce qui suit:
RuntimeWarning: débordement rencontré dans long_scalars
Quelqu'un Pourrait-il préciser ce que cela signifie et ce que je pourrais faire pour résoudre ce problème?
Le code s'exécute, mais je ne suis pas sûr que ce soit une bonne idée d'ignorer l'avertissement.
Cela se produit pendant un processus d'ajout comme:
SomeList.append(VeryLongFormula)
2 réponses
Voici un exemple qui émet le même avertissement:
import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a
Rendements
RuntimeWarning: overflow encountered in long_scalars
Dans l'exemple ci-dessus, cela se produit parce que a
est de type dtype int32
, et la valeur maximim stockable dans un int32
est 2**31-1. Depuis 10**10 > 2**32-1
, l'exponentiation résulte en un nombre qui est plus grand que celui qui peut être stocké dans un int32
.
Notez que vous ne pouvez pas compter sur np.seterr(all='warn')
pour attraper tout débordement
les erreurs dans numpy. Par exemple, sur NumPy 32 bits
>>> np.multiply.reduce(np.arange(21)+1)
-1195114496
Sur 64 bits NumPy:
>>> np.multiply.reduce(np.arange(21)+1)
-4249290049419214848
Les deux échouent sans avertissement, bien que cela soit également dû à une erreur de débordement. La bonne réponse est que 21! égal à
In [47]: import math
In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
Selon numpy développeur, Robert Kern,
Contrairement aux vraies erreurs à virgule flottante (où le FPU matériel définit un drapeau chaque fois qu'il fait une opération atomique qui déborde), nous devons implémentez nous-mêmes la détection de débordement d'entiers. Nous le faisons sur le le scalaires, mais pas de tableaux car cela être trop lent à mettre en œuvre pour chaque opération atomique sur les tableaux.
Il vous incombe donc de choisir dtypes
approprié pour qu'aucune opération ne déborde.
Un moyen facile de surmonter ce problème est d'utiliser Type 64 bits
list = numpy.array(list, dtype=numpy.float64)