Подтвердить что ты не робот

Является ли Python == отношением эквивалентности к поплавкам?

В родном Python, не используя NumPy (для которого numpy.nan != numpy.nan), нет NaN, так что я прав, думая, что плавающая точка Python == рефлексивна? Тогда, поскольку она симметрична (a == b означает b == a) и транзитивной (если a==b и b==c, тогда a==c), можно ли сказать, что Python == является отношением эквивалентности на float s?

EDIT: ОК, поэтому я узнал, что есть NaN: float('nan') (спасибо @unutbu), который будет распространяться через различные операции, но какой-либо собственный метод Python возвращает его (а не поднимает исключение), не представляя его по этому заданию?

4b9b3361

Ответ 1

== является рефлексивным для всех чисел, ноль, -zero, ininity и -infinity, но не для nan.

Вы можете получить inf, -inf и nan в родном Python только арифметическими операциями над литералами, как показано ниже.

Они ведут себя правильно, как в IEEE 754, и без исключения в области математики:

>>> 1e1000 == 1e1000
True
>>> 1e1000/1e1000 == 1e1000/1e1000
False

1e1000 - очень большое число, поэтому float и double представляют его как бесконечность.

  • бесконечность равна бесконечности
  • бесконечность, деленная на бесконечность, не является числом
  • не число!= не число

Арифметика с плавающей точкой в ​​Python также работает нормально для бесконечности минус бесконечность и т.д.:

>>> x = 1e1000
>>> x
inf
>>> x+x
inf
>>> x-x
nan
>>> x*2
inf
>>> x == x
True
>>> x-x == x-x
False
>>> 

И для нулевого и минус-нулевого случая:

>>> inf = float("inf")
>>> 1/inf
0.0
>>> -1/inf
-0.0
>>> -1/inf == 1/inf
True
>>> 

Ответ 2

float('nan') существует в native Python и float('nan') != float('nan'). Таким образом, нет, == не является отношением эквивалентности , поскольку ему не хватает рефлексивности:

In [40]: float('nan') == float('nan')
Out[40]: False