В C, когда поддерживается ±0.0, -0.0 или +0.0, назначенный double, обычно не делает арифметической разницы. Хотя они имеют разные битовые шаблоны, они арифметически сравниваются как равные.
double zp = +0.0;
double zn = -0.0;
printf("0 == memcmp %d\n", 0 == memcmp(&zn, &zp, sizeof zp));// --> 0 == memcmp 0
printf("==          %d\n", zn == zp);                        // --> ==          1
Вдохновляем комментарий @Pascal Cuoq, я ищу еще несколько функций в стандарте C, которые предоставляют арифметически разные результаты.
Примечание. Многие функции, такие как sin(), возвращают +0.0 из f(+0.0) и -0.0 из f(-0.0). Но они не дают различных арифметических результатов. Также 2 результата не должны быть NaN.
