Heim > Backend-Entwicklung > Golang > Wie kann ich Gleitkommazahlen in Go effizient auf nahezu Gleichheit vergleichen?

Wie kann ich Gleitkommazahlen in Go effizient auf nahezu Gleichheit vergleichen?

Linda Hamilton
Freigeben: 2024-12-07 14:07:15
Original
788 Leute haben es durchsucht

How Can I Efficiently Compare Floating-Point Numbers for Near Equality in Go?

Go Float-Vergleich: Ein effizienter Ansatz für nahezu Gleichheit

In Go kann der Vergleich zweier Floats (float64) auf Gleichheit eine knifflige Aufgabe sein aufgrund der Einschränkungen der IEEE 754-Gleitkommadarstellung. Während die herkömmliche Methode „abs(diff) < epsilon“ eine Näherung liefert, kann sie zu Inkonsistenzen führen.

Vorgeschlagene Lösung: Vergleich auf Bitebene

Ein Vorschlag Die Lösung schlägt vor, die bitweise Darstellung der float64-Werte zu vergleichen. Der Grundgedanke ist, dass ein Unterschied von einem Bit in der Binärdarstellung nahezu Gleichheit gewährleistet, da jeder größere Unterschied zu einem anderen Vorzeichenbit oder Exponenten führen würde.

Implementierung:

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
}
Nach dem Login kopieren

Bewertung:

Obwohl dieser Ansatz vielversprechend erscheinen mag, hat er Nachteile Einschränkungen:

  • Präzisionsverlust: Der bitweise Vergleich ignoriert die Präzision der Floats, was zu möglichen Ungenauigkeiten führen kann.
  • Inkonsistente Ergebnisse: Abhängig von der spezifischen Binärdarstellung liefert diese Methode möglicherweise nicht immer konsistente Ergebnisse. Beispielsweise können zwei Gleitkommazahlen mit der gleichen Größe, aber unterschiedlichen Vorzeichen identische bitweise Darstellungen haben.

Empfohlene Lösung: Gleitkommasubtraktion

Eine zuverlässigere und Ein effizienter Ansatz für nahezu Gleichheit besteht darin, einfach die beiden Gleitkommazahlen zu subtrahieren und zu prüfen, ob die Differenz kleiner als ein vordefinierter Wert ist Schwellenwert:

const float64EqualityThreshold = 1e-9

func almostEqual(a, b float64) bool {
    return math.Abs(a - b) <= float64EqualityThreshold
}
Nach dem Login kopieren

Diese Methode bewahrt die Präzision der Floats und liefert konsistente Ergebnisse, was sie zu einer robusten Lösung für den Vergleich von Float64-Werten auf nahezu Gleichheit macht.

Das obige ist der detaillierte Inhalt vonWie kann ich Gleitkommazahlen in Go effizient auf nahezu Gleichheit vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage