Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Странная работа NaN в python: nan != nan and [nan] == [nan]

#python #float


Есть такой код:

a = float("nan")
a == a              # Получаем False
[a] == [a]          # Получаем True


Почему так происходит?
    


Ответы

Ответ 1



Потому что в первом случае работает свойство NaN. А во втором случае Python проверяет на равенство массивы, а не объекты a. В данном случае [a] == [a] - объекты внутри массивов одни и те же (один и тот же экземпляр класса), а следовательно Python будет реагировать на a как на обычные объекты (сначала сравнивать по ссылкам).

Ответ 2



Здесь есть некоторая несогласованность. С одной стороны, в CPython, nan != nan возвращает значение, которое Си на данной системе возвращает для nan — float_richcompare(): Python x == y delivers the same result as the platform C x == y when x and/or y is a NaN. что означает IEEE 754 поведение как правило: NaN не равен даже самому себе. С другой стороны, сравнение элементов списков, использует сравнение, которое сперва проверяет ссылаются ли параметры на один и тот же объект, не вызывая операцию равенства (a==b) для случая a is b— PyObject_RichCompareBool(): Quick result when objects are the same. Guarantees that identity implies equality. Поэтому [nan] == [nan] (так как nan is nan), не смотря на то, что nan != nan. Формально, Питон (вне зависимости от реализации) гарантирует, что x == x ложно для x = float('NaN'), но внутри коллекции такой как список x == x всегда считается истинно: the comparison of collections assumes that for a collection element x, x == x is always true.

Комментариев нет:

Отправить комментарий