Je suis nouveau en programmation. Dans mon dernier projet Python 2.7), j'ai rencontré les problèmes suivants:
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 est complet, mais je ne suis pas sûr que ce soit une bonne idée de simplement ignorer l'avertissement.
Cela se produit pendant un processus d'ajout comme:
SomeList.append(VeryLongFormula)
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
les rendements
RuntimeWarning: overflow encountered in long_scalars
Dans l'exemple ci-dessus, cela se produit parce que a
est de type int32
Et que la valeur maximale mémorisable dans un int32
Est égale à 2 ** 31-1. Depuis 10**10 > 2**32-1
, L’exponentiation a pour résultat un nombre plus grand que celui qui peut être stocké dans un int32
.
Notez que vous ne pouvez pas compter sur np.seterr(all='warn')
pour intercepter toutes les erreurs de débordement dans numpy. Par exemple, sur NumPy 32 bits
>>> np.multiply.reduce(np.arange(21)+1)
-1195114496
sur NumPy 64 bits:
>>> 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! équivaut à
In [47]: import math
In [48]: math.factorial(21)
Out[50]: 51090942171709440000L
Selon le développeur de Numpy, Robert Kern ,
Contrairement aux vraies erreurs en virgule flottante (où la FPU matérielle définit un indicateur chaque fois qu’elle effectue une opération atomique qui déborde), nous devons implémenter nous-mêmes la détection de débordement d’entier. Nous le faisons sur les scalaires, mais pas sur les tableaux, car il serait trop lent à implémenter pour chaque opération atomique sur les tableaux.
Il vous incombe donc de choisir dtypes
approprié afin qu'aucune opération ne déborde.
Un moyen facile de surmonter ce problème consiste à utiliser type 64 bits
list = numpy.array(list, dtype=numpy.float64)