Посмотрите −0 (число) в Википедии
В основном IEEE действительно определяет отрицательный ноль.
И по этому определению для всех целей:
-0.0 == +0.0 == 0
Я согласен с aaronasterling, что -0.0
и +0.0
являются разными объектами. Уравнивание их (оператор равенства) гарантирует, что в код не будут внесены тонкие ошибки.
Подумайте о a * b == c * d
>>> a = 3.4
>>> b =4.4
>>> c = -0.0
>>> d = +0.0
>>> a*c
-0.0
>>> b*d
0.0
>>> a*c == b*d
True
>>>
[Изменить: дополнительная информация на основе комментариев]
Когда я сказал это для всех практических целей, я выбрал это слово довольно поспешно. Я имел в виду стандартное сравнение на равенство.
Как сказано в ссылке, стандарт IEEE определяет сравнение так, чтобы +0 = -0
, а не -0 < +0
. Хотя можно всегда игнорировать знак нуля, стандарт IEEE этого не делает. Когда при умножении или делении используется знаковый ноль, при вычислении знака ответа применяются обычные правила знаков.
Такие операции, как divmod
и atan2
, демонстрируют это поведение. Фактически atan2
соответствует определению IEEE, как и базовая библиотека C.
>>> divmod(-0.0,100)
(-0.0, 0.0)
>>> divmod(+0.0,100)
(0.0, 0.0)
>>> math.atan2(0.0, 0.0) == math.atan2(-0.0, 0.0)
True
>>> math.atan2(0.0, -0.0) == math.atan2(-0.0, -0.0)
False
Один из способов - выяснить в документации, соответствует ли реализация требованиям IEEE. Из обсуждения также кажется, что существуют и тонкие вариации платформ.
Однако этот аспект (соответствие определению IEEE) соблюдался не везде. См. Отказ от PEP 754 из-за отсутствия интереса! Я не уверен, что это было позже.
См. Также Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой .
person
pyfunc
schedule
03.11.2010