Как получить NaN, когда я делюсь на ноль

Когда я делаю деление с плавающей запятой в Python, если я делю на ноль, я получаю исключение:

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

Мне бы хотелось получить вместо NaN или Inf (потому что NaN или Inf будет корректно распространяться по остальным моим вычислениям и не убивать мою программу).

Как я могу это сделать?

Ответ 1

Самый простой способ получить это поведение - использовать numpy.float64 вместо Python по умолчанию float type:

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

Конечно, для этого требуется NumPy. Вы можете использовать numpy.seterr() для точной настройки обработки ошибок.

Ответ 2

Метод 1:

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

Метод 2:

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

Но имейте в виду, что значение также может быть -Inf, поэтому вы должны сделать более отличительный тест. Тем не менее, это выше должно дать вам идею, как это сделать.

Ответ 3

Вы можете попробовать использовать десятичный модуль:

>>> 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

Ответ 4

Если я правильно понимаю вашу проблему, это должно быть решением:

try:
   1.0/0.0
except:    
   return 'inf'

вы можете изменить его в соответствии с доступным методом обработки исключений python

Ответ 5

Я использовал функцию-оболочку в моей программе python для простого деления, которое возвращало ZeroDivisionError, когда датчики, которые я использовал, не были подключены. Он просто возвращает 0 (ноль), что в реальных условиях - это то, что Я хотел. Вероятно, становится беспорядочным с большим количеством переменных, однако...

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