Dlaczego Go ma specjalną skrzynkę na abs (0)

9

Bawiłem się z Go i znalazłem ten szczególny interesujący kod funkcji abs w pakiecie matematycznym:

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  }

Dlaczego potrzebujemy specjalnego przypadku x == 0? Co się stanie, jeśli usunę wiersz 18 i 19?

użytkownik84386
źródło

Odpowiedzi:

16

Komentarz wyjaśnia przyczynę - abs(-0)powinien zwrócić 0, ale bez specjalnego przypadku, abs(-0)zwróciłoby -0.

Zakładam, że Go używa pływaków IEEE, więc zarówno +0, jak i -0 mogą być reprezentowane przy użyciu różnych wartości dla bitu znakowego.

Zawietrzny
źródło
Dobrze więc, ale czy 0 i -0 nie są reprezentowane w pamięci w ten sam sposób?
user84386
6
@ user84386 - Zakładam, że Go używa pływaków IEEE, więc będzie miał bit znaku, więc zarówno +0, jak i -0 są reprezentatywne.
Lee
9

Standard zmiennoprzecinkowy IEEE 754 zezwala na podpisane zera . Zero ujemne jest równe zero dodatniemu, więc nie zostanie objęte < 0testem.

parsifal
źródło