Назначение переменной NaN в python без numpy

большинство языков имеют константу NaN, которую можно использовать для присвоения переменной значения NaN. Может ли python сделать это без использования numpy?

6 ответов


Да -- использовать float('nan'). Как в Python 3.5, вы также можете использовать math.nan.

>>> a = float('nan')
>>> print(a)
nan
>>> print(a + 2)
nan
>>> a == a
False
>>> import math
>>> math.isnan(a)
True
>>> # Python 3.5+
>>> math.isnan(math.nan)
True

на float(...) функция нечувствительна к регистру -- doing float('NAN') или float('naN') или подобные вещи тоже будут работать.

обратите внимание, что проверка, чтобы увидеть, если две вещи, которые NaN равны друг другу, всегда будет возвращать false. Это отчасти потому, что две вещи, которые "не являются числом", нельзя (строго говоря) сказать равными друг другу-см.--40-->что обоснование для всех сравнений, возвращающих false для значений IEEE754 NaN? для больше деталей и информации.

вместо этого используйте math.isnan(...) если нужно определить, является ли значение NaN или нет.

кроме того, точная семантика == операция над значением NaN может вызвать тонкие проблемы при попытке сохранить NaN внутри типов контейнеров, таких как list или dict (или при использовании пользовательских типов контейнеров). См.проверка на NaN присутствие в контейнере для получения более подробной информации.


вы также можете создавать числа NaN с помощью Python decimal модуль:

>>> from decimal import Decimal
>>> b = Decimal('nan')
>>> print(b)
NaN
>>> print(repr(b))
Decimal('NaN')
>>>
>>> Decimal(float('nan'))
Decimal('NaN')
>>> 
>>> import math
>>> math.isnan(b)
True

math.isnan(...) также будет работать с десятичными объектов.


, вы не может построить числа NaN в Python в фракции модуль:
>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 146, in __new__
    numerator)
ValueError: Invalid literal for Fraction: 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 130, in __new__
    value = Fraction.from_float(numerator)
  File "C:\Python35\lib\fractions.py", line 214, in from_float
    raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
ValueError: Cannot convert nan to Fraction.

Кстати, вы также можете сделать float('Inf'), Decimal('Inf') или math.inf (3.5+) для присвоения бесконечных чисел. (И также см. math.isinf(...))

делаешь Fraction('Inf') или Fraction(float('inf')) не разрешено и будет выдавать исключение, как и NaN.

если вы хотите быстрый и простой способ проверить, не является ли число ни NaN, ни бесконечным, вы можете использовать math.isfinite(...) начиная с Python 3.2+.


если вы хотите сделать подобные проверки с комплексными числами, то cmath модуль содержит аналогичный набор функций и константы как math модуль:


nan = float('nan')

и теперь у вас есть постоянный, nan.

вы можете аналогично создавать значения NaN для decimal.Десятичный.:

dnan = Decimal('nan')

использовать float("nan"):

>>> float("nan")
nan

можно сделать float('nan') получить Нэн.


вы можете получить NaN от "inf-inf", и вы можете получить" inf " от числа больше 2e308, поэтому я обычно использовал:

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan

более последовательный (и менее непрозрачный) способ генерации inf и-inf-снова использовать float ():

>> positive_inf = float('inf')
>> positive_inf
inf
>> negative_inf = float('-inf')
>> negative_inf
-inf

обратите внимание, что размер поплавка варьируется в зависимости от архитектуры, поэтому, вероятно, лучше избегать использования магических чисел, таких как 9e999, даже если это, вероятно, сработает.

import sys
sys.float_info
sys.float_info(max=1.7976931348623157e+308,
               max_exp=1024, max_10_exp=308,
               min=2.2250738585072014e-308, min_exp=-1021,
               min_10_exp=-307, dig=15, mant_dig=53,
               epsilon=2.220446049250313e-16, radix=2, rounds=1)