Для значения с плавающей запятой a: a * 0.0 == 0.0 всегда оценивает true для конечных значений a?

Я всегда предполагал, что следующий тест всегда будет успешным для конечных значений (без INF, без NAN) somefloat:

assert(somefloat*0.0==0.0);

В Умножьте на 0 оптимизацию было заявлено, что double a=0.0 а также double a=-0.0 не строго говоря одно и то же.

Поэтому мне было интересно, может ли это привести к проблемам на некоторых платформах, например может ли результат вышеуказанного теста зависеть от a быть положительным или отрицательным.

10

Решение

Если ваша реализация использует арифметику IEEE 754 (что большинство и делают), то положительный и отрицательный ноль будут сравниваться равными. Так как левая часть вашего выражения может быть только положительным или отрицательным нулем для конечного aУтверждение всегда будет верным.

Если он использует какую-то другую арифметику, то только разработчик, и, надеюсь, документация, относящаяся к реализации, может сказать вам. Можно утверждать (см. Комментарии), что формулировка стандарта может подразумевать, что они должны сравниваться одинаково в любом случае, и, конечно, никакая вменяемая реализация не сделает иначе.

9

Другие решения

-0.0 == 0.0 согласно правилам двойного сравнения.

За нефинитных значения (+ -Inf, Nan) somefloat * 0.0! = 0.0.

3

Ваш assert никогда не может потерпеть неудачу, пока somefloat не является
бесконечность или NaN. В системах, которые не поддерживают бесконечность или
NaN, компилятор может просто оптимизировать его.

1
По вопросам рекламы [email protected]