Gleitkomma-Präzision in Go: float32 vs. float64
In Go werden Gleitkommazahlen im Binärformat IEEE 754 dargestellt. Dieses Format bietet je nach verwendetem Datentyp unterschiedliche Präzisionsgrade, wobei float32 eine geringere Genauigkeit bietet als float64.
Betrachten Sie den folgenden Codeausschnitt, der zeigt浮点数误差:
package main import "fmt" func main() { a := float64(0.2) a += 0.1 a -= 0.3 var i int for i = 0; a < 1.0; i++ { a += a } fmt.Printf("After %d iterations, a = %e\n", i, a) }
Wann Mit float64 gibt das Programm korrekt Folgendes aus:
After 54 iterations, a = 1.000000e+00
Allerdings, wenn Wird stattdessen float32 verwendet, gerät das Programm in eine Endlosschleife. Dies liegt daran, dass float32 den Dezimalwert 0,1 nicht exakt darstellen kann, was zu einem leicht gerundeten Wert führt. Dieser gerundete Wert verhindert, dass die Schleife beendet wird.
Um diesen Unterschied zu verstehen, untersuchen Sie die binäre Darstellung der beteiligten Gleitkommawerte:
float32(0.1): 00111101110011001100110011001101 float32(0.2): 00111110010011001100110011001101 float32(0.3): 00111110100110011001100110011010 float64(0.1): 0011111110111001100110011001100110011001100110011001100110011010 float64(0.2): 0011111111001001100110011001100110011001100110011001100110011010 float64(0.3): 0011111111010011001100110011001100110011001100110011001100110011
Beachten Sie, dass die binäre Darstellung von 0,1 in float32 unterscheidet sich geringfügig von dem in float64. Dieser geringfügige Unterschied führt zu einer unterschiedlichen Interpretation des Werts durch den Typ float32, was zu dem beobachteten Verhalten führt.
Zusammenfassend lässt sich sagen, dass bei Verwendung von float32 der ungefähre Wert 0,1 im Speicher gespeichert wird, was sich auf die Genauigkeit auswirkt Genauigkeit von Gleitkommaoperationen. Im Gegensatz dazu kann float64 den Dezimalwert 0,1 genauer darstellen, was präzisere Berechnungen ermöglicht.
Das obige ist der detaillierte Inhalt vonGos Gleitkomma-Präzision: Warum verursacht „float32' Endlosschleifen, während „float64' dies nicht tut?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!