Определяет ли 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
>>>