Pourquoi Go a-t-il un cas spécial pour les abdos (0)

9

Je jouais avec Go et j'ai trouvé ce code particulièrement intéressant pour la fonction abs dans le package mathématique:

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  }

Pourquoi devons-nous avoir le cas particulier de x == 0? Que se passera-t-il si je supprime les lignes 18 et 19?

user84386
la source

Réponses:

16

Le commentaire explique la raison - abs(-0)devrait retourner 0, mais sans le cas spécial, abs(-0)retournerait -0.

Je suppose que Go utilise des flottants IEEE afin que +0 et -0 puissent être représentés en utilisant différentes valeurs pour le bit de signe.

Lee
la source
D'accord, mais 0 et -0 ne sont-ils pas représentés de la même manière dans la mémoire?
user84386
6
@ user84386 - Je suppose que Go utilise des flottants IEEE, donc il aura un bit de signe, donc +0 et -0 sont tous les deux représentables.
Lee
9

La norme à virgule flottante IEEE 754 autorise les zéros signés . Un zéro négatif est égal à un zéro positif, il ne serait donc pas couvert par le < 0test.

parsifal
la source