Heim > Backend-Entwicklung > Golang > Warum liefern Gleitkommavergleiche in Go unterschiedliche Ergebnisse für Literale und Variablen?

Warum liefern Gleitkommavergleiche in Go unterschiedliche Ergebnisse für Literale und Variablen?

Mary-Kate Olsen
Freigeben: 2024-12-09 15:04:16
Original
719 Leute haben es durchsucht

Why do floating-point comparisons in Go yield different results for literals and variables?

Gleitkomma-Präzisionsunterschiede in Go: Literale vs. Variablen

In Go kann das Verhalten der Gleitkomma-Arithmetik beim Vergleich widersprüchlich erscheinen Operationen mit Literalen und Variablen. Sehen wir uns den folgenden Code an:

package main

import (
    "fmt"
)

func main() {
    x := 10.1

    fmt.Println("x == 10.1:        ", x == 10.1)
    fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0)
    fmt.Println("x*3.0:            ", x*3.0)
    fmt.Println("10.1*3.0:         ", 10.1*3.0)
}
Nach dem Login kopieren

Bei der Ausführung zeigt dieser Code die folgende Ausgabe an:

x == 10.1:         true
x*3.0 == 10.1*3.0: false
x*3.0:             30.299999999999997
10.1*3.0:          30.3
Nach dem Login kopieren

Wie in der Ausgabe zu sehen ist, der Vergleich von x*3.0 und 10.1*3.0 wird unerwartet als falsch ausgewertet. Dies wirft die Frage auf, warum diese Diskrepanz auftritt und ob sie beabsichtigt oder ein Fehler ist.

Das Design verstehen

In Go haben Gleitkomma-Literale und -Konstanten unbegrenzte Genauigkeit . Wenn sie jedoch typisierten Variablen zugewiesen werden, wird ihre Genauigkeit durch die Grenzen des Zieltyps eingeschränkt. Im obigen Beispiel speichert x := 10.1 das Literal 10.1 in einer float64-Variablen. Diese Konvertierung führt aufgrund der Einschränkungen des Typs float64 zu einem gewissen Präzisionsverlust.

Im Gegensatz dazu führt der Ausdruck 10.1*3.0 eine Gleitkommamultiplikation direkt auf den Literalen durch und behält so deren volle Präzision bei. Dies führt zu einem etwas anderen Wert im Vergleich zu x*3.0, wo sich die verringerte Genauigkeit von x auf die Berechnung auswirkt.

Dokumentation und Ressourcen

Die offizielle Go-Dokumentation bestätigt dies Verhalten im Abschnitt „Floats“ des Artikels „Konstanten“. Darin wird erklärt, dass numerische Konstanten zwar eine beliebige Genauigkeit haben, bei der Zuweisung jedoch in den Zieltyp passen müssen. Große Werte wie 1e1000 können in Ausdrücken mit anderen Konstanten verwendet werden, ihre Genauigkeit kann jedoch beeinträchtigt werden, wenn das Ergebnis in einem engeren Typ gespeichert wird.

Obwohl der Artikel das in unserem Beispiel beobachtete spezifische Verhalten nicht ausdrücklich erwähnt (x*3,0 vs. 10,1*3,0) bietet es ein allgemeines Verständnis dafür, wie Präzisionsbeschränkungen für Konstanten und typisierte Variablen gelten.

Das obige ist der detaillierte Inhalt vonWarum liefern Gleitkommavergleiche in Go unterschiedliche Ergebnisse für Literale und Variablen?. 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