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)
33
demandé sur nbro 2011-09-26 22:32:44

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.

40
répondu unutbu 2016-01-14 14:39:33

Un moyen facile de surmonter ce problème est d'utiliser Type 64 bits

list = numpy.array(list, dtype=numpy.float64)
0
répondu Khaled 2018-02-12 08:27:56