Warum hat Go einen Sonderfall für abs (0)

9

Ich habe mit Go herumgespielt und diesen besonders interessanten Code für die abs-Funktion im Mathe-Paket gefunden:

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  }

Warum brauchen wir den Sonderfall x == 0? Was passiert, wenn ich die Zeilen 18 und 19 lösche?

user84386
quelle

Antworten:

16

Der Kommentar erklärt den Grund - abs(-0)sollte 0 zurückgeben, würde aber ohne den Sonderfall abs(-0)-0 zurückgeben.

Ich gehe davon aus, dass Go IEEE-Floats verwendet, sodass sowohl +0 als auch -0 mit unterschiedlichen Werten für das Vorzeichenbit dargestellt werden können.

Lee
quelle
Okay, aber sind 0 und -0 im Speicher nicht gleich dargestellt?
user84386
6
@ user84386 - Ich gehe davon aus, dass Go IEEE-Floats verwendet, daher hat es ein Vorzeichenbit, sodass sowohl +0 als auch -0 darstellbar sind.
Lee
9

Der Gleitkomma-Standard IEEE 754 erlaubt vorzeichenbehaftete Nullen . Eine negative Null ist gleich einer positiven Null, sodass sie vom < 0Test nicht abgedeckt wird .

Parsifal
quelle