¿Por qué Go tiene un caso especial para abdominales (0)

9

Estaba jugando con Go, y encontré este código interesante en particular para la función abs en el paquete matemático:

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  }

¿Por qué necesitamos tener el caso especial de x == 0? ¿Qué pasará si elimino las líneas 18 y 19?

user84386
fuente

Respuestas:

16

El comentario explica la razón: abs(-0)debería devolver 0, pero sin el caso especial, abs(-0)devolvería -0.

Supongo que Go usa flotadores IEEE para que tanto +0 como -0 puedan representarse utilizando diferentes valores para el bit de signo.

Sotavento
fuente
Bien entonces, pero ¿no están 0 y -0 representados de la misma manera en la memoria?
user84386
66
@ user84386 - Supongo que Go usa flotadores IEEE, por lo que tendrá un bit de signo, por lo que tanto +0 como -0 son representables.
Lee
9

El estándar de punto flotante IEEE 754 permite ceros con signo . Un cero negativo es igual a un cero positivo, por lo que no sería cubierto por la < 0prueba.

parsifal
fuente