Heim > Backend-Entwicklung > Golang > Gos Gleitkomma-Präzision: Warum verursacht „float32' Endlosschleifen, während „float64' dies nicht tut?

Gos Gleitkomma-Präzision: Warum verursacht „float32' Endlosschleifen, während „float64' dies nicht tut?

DDD
Freigeben: 2024-12-24 14:56:11
Original
459 Leute haben es durchsucht

Go's Floating-Point Precision: Why Does `float32` Cause Infinite Loops While `float64` Doesn't?

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

Wann Mit float64 gibt das Programm korrekt Folgendes aus:

After 54 iterations, a = 1.000000e+00
Nach dem Login kopieren

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

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!

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