Почему у Go есть особый случай для abs (0)

9

Я играл с Go и нашел этот интересный код для функции abs в пакете математики:

http://golang.org/src/pkg/math/abs.go

14 func abs(x float64) float64 {
15      switch {
16      case x < 0:
17          return -x
18      case x == 0:
19          return 0 // return correctly abs(-0)
20      }
21      return x
22  }

Зачем нам нужен особый случай x == 0? Что будет, если я удалю строки 18 и 19?

user84386
источник

Ответы:

16

Комментарий объясняет причину - abs(-0)должен вернуть 0, но без особого случая abs(-0)вернет -0.

Я предполагаю, что Go использует IEEE-числа с плавающей точкой, поэтому и +0, и -0 могут быть представлены разными значениями для знакового бита.

подветренный
источник
Хорошо, но разве 0 и -0 не представлены одинаково в памяти?
user84386
6
@ user84386 - Я предполагаю, что Go использует IEEE-числа с плавающей точкой, поэтому он будет иметь знаковый бит, поэтому +0 и -0 представимы.
Ли
9

Стандарт IEEE 754 с плавающей точкой допускает подписанные нули . Отрицательный ноль равен положительному нулю, поэтому он не будет покрыт < 0тестом.

Парсифаль
источник