Perché Go ha un caso speciale per gli addominali (0)


9

Stavo giocando con Go e ho trovato questo codice particolarmente interessante per la funzione abs nel pacchetto matematico:

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  }

Perché dobbiamo avere il caso speciale di x == 0? Cosa succederà se cancello le righe 18 e 19?

Risposte:


16

Il commento spiega il motivo - abs(-0)dovrebbe restituire 0, ma senza il caso speciale, abs(-0)restituirebbe -0.

Suppongo che Go utilizzi i float IEEE in modo che sia +0 che -0 possano essere rappresentati usando valori diversi per il bit di segno.


Va bene allora, ma 0 e -0 non sono rappresentati allo stesso modo nella memoria?
user84386

6
@ user84386 - Suppongo che Go utilizzi i float IEEE, quindi avrà un bit di segno, quindi sia +0 che -0 sono rappresentabili.
Lee

9

Lo standard IEEE 754 in virgola mobile consente zeri con segno . Uno zero negativo è uguale a uno zero positivo, quindi non verrebbe coperto dal < 0test.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.