Ответ Нюффы дает хороший анализ.В итоге, если вы просто используете ==
, который не различает +0
и -0
, и если вы игнорируете значения NaN
, обе идентичности сохраняются.Но вы можете отличить выражения на основе режима округления, взглянув на битовые комбинации, так как вы можете получить -0
в одном случае и 0
в другом.
Вот еще один пример, который я всегда находилудивительно.Рассмотрим определение fma
:
fma (a, b, c) = a * b + c; but with only one rounding instead of two
Если вы введете c = 0
в указанном выше тождестве, вы можете ожидать, что будет выполнено следующее:
fma (a, b, 0) == a * b
Увы, это не удастсяесли умножение генерирует -0
, так как -0 + 0
равно +0
.С левой стороны вы получите +0
, с правой стороны вы получите -0
.
Опять же, они будут сравниваться равными, используя обычный ==
, но если выВы заинтересованы в побитовом равенстве, вы должны остерегаться знака ноль!