C:Что значит, что значение double равно == -0?

StackOverflow https://stackoverflow.com/questions/617314

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Что означает удвоение значения -0 в C?

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

в gdb

> print some_double
-0
> print some_double == 0
1
Это было полезно?

Решение

Отрицательный ноль - это полезная концепция для численных вычислений, которая является действительным числом с плавающей запятой в С.

Другие советы

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

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

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

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

Акцент мой

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top