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) TrueThe
float(...)функция нечувствительна к регистру -- doingfloat('NAN')илиfloat('naN')или подобные вещи тоже будут работать.обратите внимание, что проверка, чтобы увидеть, если две вещи, которые NaN равны друг другу всегда будет возвращать false. Отчасти это связано с тем, что две вещи, которые "не являются числом", не могут (строго говоря) быть равны друг другу-см. что обоснование для всех сравнений, возвращающих 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 числа в Питоне фракции модуль:>>> 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, ни бесконечным, вы можете использовать
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 для десятичных чисел.Десятичный.:
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 -infimport 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)
Comments