Heim > Backend-Entwicklung > Golang > Warum führen Gleitkommavergleiche in Go manchmal zu unerwarteten Ergebnissen?

Warum führen Gleitkommavergleiche in Go manchmal zu unerwarteten Ergebnissen?

Patricia Arquette
Freigeben: 2024-12-04 11:33:09
Original
778 Leute haben es durchsucht

Why Do Floating-Point Comparisons in Go Sometimes Yield Unexpected Results?

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

In Go behalten Gleitkomma-Literale und -Konstanten ihre willkürliche Genauigkeit bei, bis sie zugewiesen werden zu einem bestimmten Typ. Bestimmte Vorgänge und Zuweisungen führen jedoch zu Präzisionsunterschieden, die unerwartet sein können.

Bedenken Sie den folgenden Code:

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

Dieser Code erzeugt die Ausgabe:

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

Warum Sind diese Ausdrücke nicht gleich, obwohl dieselbe Gleitkommaoperation ausgeführt wird?

Untypisierte Konstanten und Variablen

Zahlenliterale und Konstanten in Go sind untypisiert und mit unbegrenzter Genauigkeit. Bei der Zuweisung zu einer Variablen wie x := 10.1 wird das Literal in den Typ der Variablen (in diesem Fall float64) konvertiert und verliert etwas an Präzision.

Konstanten mit voller Präzision

Im Gegensatz dazu behalten wörtliche Ausdrücke wie 10.1*3.0 vor der Auswertung die volle Präzision bei. Wenn sie einer Variablen zugewiesen werden, werden sie sofort in den Typ der Variablen konvertiert, um sicherzustellen, dass die Präzision erhalten bleibt.

Überlegungen zur Präzision

Das Verständnis der Unterschiede in der Präzisionshandhabung kann von entscheidender Bedeutung sein für genaue Gleitkommaberechnungen. Wenn Sie beispielsweise Werte mit einer bestimmten Toleranz vergleichen, ist es wichtig, Literale oder Ausdrücke mit voller Präzision zu verwenden, um falsch positive Ergebnisse zu vermeiden.

Dokumentation

Dieses Verhalten ist gut -dokumentiert im Go-Blogartikel „Constants“ unter der Überschrift „Floats“, in dem erklärt wird, dass numerische Konstanten zwar eine willkürliche Genauigkeit haben, aber in den Bereich von passen müssen Variable, der sie zugewiesen sind.

Fazit

Der Unterschied in der Präzision zwischen Gleitkommakonstanten und Variablen in Go ist beabsichtigt und ermöglicht eine größere Flexibilität und einen besseren Leistungsaustausch -offs in Gleitkommaoperationen. Durch das Verständnis dieser Präzisionsunterschiede können Programmierer ihren Code im Hinblick auf Genauigkeit und Effizienz optimieren.

Das obige ist der detaillierte Inhalt vonWarum führen Gleitkommavergleiche in Go manchmal zu unerwarteten Ergebnissen?. 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