Heim > Backend-Entwicklung > Golang > Wie kann ich Gleitkommazahlen in Go genau und effizient vergleichen?

Wie kann ich Gleitkommazahlen in Go genau und effizient vergleichen?

DDD
Freigeben: 2024-12-17 21:03:12
Original
580 Leute haben es durchsucht

How Can I Accurately and Efficiently Compare Floating-Point Numbers in Go?

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage