Por que o Go tem um caso especial para abs (0)

9

Eu estava brincando com o Go e encontrei este código interessante em particular para a função abs no pacote 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 que precisamos ter o caso especial de x == 0? O que acontecerá se eu excluir as linhas 18 e 19?

user84386
fonte

Respostas:

16

O comentário explica o motivo - abs(-0)deve retornar 0, mas sem o caso especial, abs(-0)retornaria -0.

Suponho que o Go use flutuadores IEEE para que ambos os 0 e 0 possam ser representados usando valores diferentes para o bit do sinal.

Lee
fonte
Ok, então, mas não são 0 e -0 representados da mesma maneira na memória?
user84386
6
@ user84386 - Presumo que o Go use flutuadores IEEE, por isso terá um bit de sinal, de modo que +0 e -0 sejam representáveis.
21413 Lee
9

O padrão de ponto flutuante IEEE 754 permite zeros assinados . Um zero negativo é igual a um zero positivo, portanto não seria coberto pelo < 0teste.

parsifal
fonte