Здесь недопонимание относительно приоритета оператора:
(double) -2 * 0
анализируется как
((double)(-(2))) * 0
, что по существу совпадает с (-2.0) * 0.0
.
.C Стандартное информативное Приложение J перечисляет как поведение Unspecifier Могут ли определенные операторы генерировать отрицательные нули и становится ли отрицательный ноль нормальным нулем при хранении в объекте (6.2.6.2).
И наоборот,(double)(-2 * 0)
должен генерировать положительный ноль 0.0
на большинстве современных платформ, поскольку умножение выполняется с использованием целочисленной арифметики.В стандарте C есть поддержка архитектур, которые различают положительные и отрицательные целые нули, но в наши дни они исчезающе редки.
Если вы хотите, чтобы нули были положительными, это простое исправление должно работать:
if (d == 0) {
d = 0;
}
Вы можете прояснить намерение с помощью этого:
if (d == -0.0) {
d = +0.0;
}
Но проверка будет успешной, даже если d
- положительный ноль.
У Chux более простое решение для IEC60559 соответствующих сред:
d = d + 0.0; // turn -0.0 to +0.0