Определяет ли Python значение NaN > 0?

Определяет ли Python значение «NaN > 0»? В моем интерпретаторе Python я получаю:

>>> float('nan') > 0
False

а это гарантировано?

Если я правильно понимаю, стандарт IEEE 754 присваивает значение False любому сравнению, включающему NaN. Однако я не могу найти в документации Python ничего, что указывало бы на соблюдение этого стандарта. Я даже понимаю, что 1/0 должно давать бесконечность в соответствии с IEEE 754, но Python вызывает исключение (ZeroDivisionError), поэтому Python не полностью соответствует IEEE 754.

Итак, результат float('nan') > 0 полностью определен в Python? Мне нужно знать, одинаково ли это на всех платформах и со всеми версиями Python (включая старые).


person Eric O Lebigot    schedule 07.12.2013    source источник
comment
Я думаю, что NaN в Python недостаточно документированы. Подразумевается, что они соответствуют стандарту IEEE 754, но, похоже, это не обязательно.   -  person NPE    schedule 07.12.2013


Ответы (3)


Все реализации Python, которые я использовал на разных платформах, используют IEEE-754 и будут вести себя так, как вы описываете.

Однако, похоже, это формально не предусмотрено языком. Настолько, что в руководстве говорится следующее (выделено мной):

Почти сегодня (июль 2010 г.) все машины используют арифметику с плавающей запятой IEEE-754, и почти все платформы сопоставляют числа с плавающей запятой Python с «двойной точностью» IEEE-754.

Вот соответствующая ветка от 2008 года: Python на платформах, отличных от IEEE-754: запрос информации.

Очень легко проверить, ведет ли себя ваш интерпретатор/платформа так, как вы ожидаете. Если вы критически зависите от этого, вы можете легко обнаружить несоответствие при запуске вашей программы.

person NPE    schedule 07.12.2013

Я думаю, что это довольно безопасное предположение. Документация по mathбиблиотеке подразумевает, что NaN в python должен действовать, как указано в IEEE 754.

Конечно, если вы действительно параноик по этому поводу, вы можете написать UnitTest, и тогда, если вы когда-нибудь найдете систему, в которой это не работает, по крайней мере, вы сразу об этом узнаете.

person mgilson    schedule 07.12.2013
comment
Математическая библиотека подразумевает не намного больше, чем само существование float('nan') в Python… Вопрос на самом деле в том, насколько поддерживается NaN, в том числе в определении (или нет) результата NaN > 0. Я думаю, что NPE пригвоздил его: официально полная поддержка не гарантируется. - person Eric O Lebigot; 07.12.2013
comment
@EOL - Я не так прочитал. для получения дополнительной информации о NaN обратитесь к IEEE 754. Для меня это говорит о том, что NaN действует так же, как в IEEE 754. - person mgilson; 07.12.2013
comment
Справедливо. Однако я понимаю, что NaN является концепцией IEEE 754, поэтому IEEE 754 неявно упоминается как float('nan'), не так ли? - person Eric O Lebigot; 07.12.2013

Эта ссылка предполагает, что концепция NaN была включена в Python версии 2.3. Таким образом, он должен быть одинаковым на всех платформах в используемых в настоящее время версиях.

Он также имеет реализацию в библиотеке math.

e.g. math.isnan()

Checks if the float x is a NaN (not a number).
NaNs are part of the IEEE 754 standards. Operation like but not limited to
inf * 0, inf / inf or any operation involving a NaN, e.g. nan * 1, return a NaN.


New in version 2.6.

>>> import math
>>> x=float('nan')
>>> math.isnan(x)
True
>>>
person shshank    schedule 07.12.2013
comment
Настоящий вопрос заключается в том, насколько Python совместим с IEEE 754… Ответ NPE довольно точен: IEEE 754 не является обязательным для языка. - person Eric O Lebigot; 09.12.2013