Определяет ли 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 (включая старые).

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

например. 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
>>>