Назначение переменной 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
модуль:
cmath.isnan(...)
cmath.isinf(...)
-
cmath.isfinite(...)
(Python 3.2+) -
cmath.nan
(Python 3.6+; эквивалентcomplex(float('nan'), 0.0)
) -
cmath.nanj
(Python 3.6+; эквивалентcomplex(0.0, float('nan'))
) -
cmath.inf
(Python 3.6+; эквивалентcomplex(float('inf'), 0.0)
) -
cmath.infj
(Python 3.6+; эквивалентcomplex(0.0, float('inf'))
)
nan = float('nan')
и теперь у вас есть постоянный, nan
.
вы можете аналогично создавать значения NaN для decimal.Десятичный.:
dnan = Decimal('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)