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?

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.