Cómo obtener NaN cuando divido por cero

Cuando hago división de punto flotante en Python, si divido entre cero, obtengo una excepción:

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

Realmente me gustaría obtener NaN o Inf lugar (porque NaN o Inf se propagarán a través del rest de mis cálculos correctamente y no eliminarán mi progtwig).

¿Cómo puedo hacer esto?

La forma más fácil de obtener este comportamiento es usar numpy.float64 lugar del tipo float predeterminado de Python:

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

Por supuesto esto requiere NumPy. Puede usar numpy.seterr() para ajustar el manejo de errores.

Método 1:

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

Método 2:

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

Pero tenga en cuenta que el valor también podría ser -Inf , por lo que debería hacer una prueba más distintiva. Sin embargo, esto arriba debería darte la idea de cómo hacerlo.

Podrías intentar usar el módulo ‘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 

Si entiendo su problema correctamente, entonces esta debería ser la solución:

 try: 1.0/0.0 except: return 'inf' 

Puedes modificarlo de acuerdo con los diversos métodos de manejo de excepciones de Python disponibles.

Utilicé una función de envoltorio en un progtwig de python para una división simple que devolvía ZeroDivisionError cuando los sensores que estaba usando no estaban enchufados. Simplemente devuelve 0 (cero), que en términos reales es lo que quería. Probablemente se ensucie con más variables, sin embargo …

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