Это хорошо известная проблема с printf
. Поскольку вы используете число с плавающей запятой, в двоичном коде невозможно одно представление. И в большинстве случаев двоичное представление не является идеальным. Таким образом, 0 сохраняется как 0.00000000000000...0042
иногда и как -0.000000000000000000000123
. Когда printf печатает второй, вы получаете нечетное -0.
Я действительно не знаю, как вы сравниваете с 0, просто не забудьте добавить эпсилон при выполнении сравнений с плавающей запятой, чтобы приспособиться к странностям. Например: чтобы проверить, равны ли два числа с плавающей запятой, никогда не пишите a == b
, но fabs(a-b) < 1e-13
, где 1e-13 - эпсилон (выберите подходящий вам показатель).