C: Что значит для двойника быть == -0? - PullRequest
7 голосов
/ 06 марта 2009

Я просто использовал gdb, чтобы распечатать значение типа double, и, к моему удивлению, оно напечатало -0

Что означает двойное значение -0 в С?

Кстати, когда я проверил равенство с 0, он вернул true: для сравнения я просто сделал следующее

в ГБД

> print some_double
-0
> print some_double == 0
1

Ответы [ 3 ]

16 голосов
/ 06 марта 2009

Отрицательный ноль является полезной концепцией для численных вычислений и является допустимым числом с плавающей точкой в ​​C.

3 голосов
/ 06 марта 2009

Это хорошо известная проблема с printf. Поскольку вы используете число с плавающей запятой, в двоичном коде невозможно одно представление. И в большинстве случаев двоичное представление не является идеальным. Таким образом, 0 сохраняется как 0.00000000000000...0042 иногда и как -0.000000000000000000000123. Когда printf печатает второй, вы получаете нечетное -0.

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

2 голосов
/ 14 января 2010

На самом деле, читая книгу «Написание отличного кода, том 1» в главе 4, автор довольно ясно дает ответ, что это из-за использования дополнения 1 для представления подписанного числа с плавающей точкой в ​​стандарте IEEE FP. Он говорит:

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

Акцент мой

...