web-dev-qa-db-fra.com

Python RuntimeWarning: dépassement de capacité rencontré dans de longs scalaires

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)
46
timkado

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.

50
unutbu

Un moyen facile de surmonter ce problème consiste à utiliser type 64 bits

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