Я всегда предполагал, что следующий тест всегда будет успешным для конечных значений (без INF, без NAN) somefloat
:
assert(somefloat*0.0==0.0);
В Умножьте на 0 оптимизацию было заявлено, что double a=0.0
а также double a=-0.0
не строго говоря одно и то же.
Поэтому мне было интересно, может ли это привести к проблемам на некоторых платформах, например может ли результат вышеуказанного теста зависеть от a
быть положительным или отрицательным.
Если ваша реализация использует арифметику IEEE 754 (что большинство и делают), то положительный и отрицательный ноль будут сравниваться равными. Так как левая часть вашего выражения может быть только положительным или отрицательным нулем для конечного a
Утверждение всегда будет верным.
Если он использует какую-то другую арифметику, то только разработчик, и, надеюсь, документация, относящаяся к реализации, может сказать вам. Можно утверждать (см. Комментарии), что формулировка стандарта может подразумевать, что они должны сравниваться одинаково в любом случае, и, конечно, никакая вменяемая реализация не сделает иначе.
-0.0 == 0.0 согласно правилам двойного сравнения.
За нефинитных значения (+ -Inf, Nan) somefloat * 0.0! = 0.0.
Ваш assert
никогда не может потерпеть неудачу, пока somefloat
не является
бесконечность или NaN. В системах, которые не поддерживают бесконечность или
NaN, компилятор может просто оптимизировать его.