Go Float-Vergleich: Ein präziserer und effizienterer Ansatz
Die Aufgabe, zwei Gleitkommazahlen (float64) auf Gleichheit in Go zu vergleichen Typischerweise geht es dabei um die Komplexität von IEEE 754 und die binäre Darstellung von Gleitkommazahlen. Obwohl es verschiedene Ansätze gibt, gehen einige davon aus, dass der Vergleich binärer Darstellungen mit einer Ein-Bit-Toleranz eine zuverlässige Lösung ist:
func Equal(a, b float64) bool { ba := math.Float64bits(a) bb := math.Float64bits(b) diff := ba - bb if diff < 0 { diff = -diff } // accept one bit difference return diff < 2 }
Dieser Ansatz weist jedoch Einschränkungen auf. Die binäre Darstellung von Gleitkommazahlen ist beim Vergleich ihrer „nahezu gleichen“ Werte nicht immer aussagekräftig. Eine direktere und präzisere Methode besteht darin, die beiden Zahlen zu subtrahieren, um ihre Differenz zu bestimmen:
package main import ( "fmt" "math" ) const float64EqualityThreshold = 1e-9 func almostEqual(a, b float64) bool { return math.Abs(a - b) <= float64EqualityThreshold } func main() { a := 0.1 b := 0.2 fmt.Println(almostEqual(a + b, 0.3)) }
Dieser Ansatz legt einen Schwellenwert für die maximal akzeptable Differenz fest und eignet sich für die meisten praktischen Szenarien, in denen ein Vergleich von Floats auf Gleichheit erforderlich ist . Es bietet eine präzisere und effizientere Lösung als der Vergleich binärer Darstellungen.
Das obige ist der detaillierte Inhalt vonWie kann ich Gleitkommazahlen in Go genau und effizient vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!