69 votes

Comment obtenir un NaN lorsque je divise par zéro ?

Lorsque je fais une division en virgule flottante en Python, si je divise par zéro, j'obtiens une exception :

>>> 1.0/0.0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division

J'aimerais vraiment avoir NaN o Inf à la place (parce que le NaN o Inf se propagera dans le reste de mon calcul correctement et ne tuera pas mon programme).

Comment puis-je le faire ?

73voto

Sven Marnach Points 133943

La manière la plus simple d'obtenir ce comportement est d'utiliser numpy.float64 au lieu de la valeur par défaut de Python float type :

>>> import numpy
>>> numpy.float64(1.0) / 0.0
inf

Bien sûr, cela nécessite NumPy. Vous pouvez utiliser numpy.seterr() pour affiner la gestion des erreurs.

25voto

glglgl Points 35668

Méthode 1 :

try:
    value = a/b
except ZeroDivisionError:
    value = float('Inf')

Méthode 2 :

if b != 0:
    value = a / b
else:
    value = float('Inf')

Mais sachez que la valeur pourrait aussi bien être -Inf Vous devez donc effectuer un test plus spécifique. Néanmoins, ce qui précède devrait vous donner une idée de la manière de procéder.

8voto

Spacedman Points 33792

Vous pouvez essayer d'utiliser le module "decimal" :

>>> from decimal import *
>>> setcontext(ExtendedContext)
>>> inf = Decimal(1) / Decimal(0)
>>> print(inf)
Infinity
>>> neginf = Decimal(-1) / Decimal(0)
>>> print(neginf)
-Infinity
>>> print(neginf + inf)
NaN
>>> print(neginf * inf)
-Infinity
>>> print(dig / 0)
Infinity

-5voto

Colin MacRae Points 15

J'ai utilisé une fonction wrapper dans un de mes programmes python pour une simple division qui retournait ZeroDivisionError lorsque les capteurs que j'utilisais n'étaient pas branchés. Elle renvoie simplement 0 (zéro), ce qui, dans le monde réel, est ce que je voulais. Cela devient probablement plus compliqué avec plus de variables, cependant...

def calculation(a, b):
    if a == 0:
        return 0
    elif b == 0:
        return 0
    else:
        return a/b

-5voto

Si je comprends bien votre problème, ceci devrait être la solution :

try:
   1.0/0.0
except:    
   return 'inf'

vous pouvez le modifier en fonction des différentes méthodes de gestion des exceptions disponibles dans Python.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X