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?

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.