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) }
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
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!