Aus der Dokumentation konvertiert es die float64
in eine uint64
, ohne die Bits zu ändern, es ist die Art, wie die Bits interpretiert werden, die sich ändern. Hier
ist der vollständige Quellcode der Float64bits
Funktion:
func Float64bits(f float64) uint64 { return *(*uint64)(unsafe.Pointer(&f)) }
Sie sich nicht von dieser Syntax Trick mit einem unsicheren Zeiger Angst, es ist durchaus üblich in Go Quellcode (verhindert das Kopieren der Daten) . Also, das ist wirklich so einfach: nimm die Binärdaten des gegebenen Floats und interpretiere sie als unsigned Integer.
Der Grund, warum es so viel ändert, ist wegen der Darstellung von Fließkommazahlen. Gemäß der Spezifikation besteht eine Gleitkommazahl aus einem Zeichen, einem Exponenten und einer Mantissa.
Auf einem 64-Bit-Float gibt es 1 Bit für das Vorzeichen, 11 Bit für den Exponenten und 52 Bit für die Mantisse.
Die Darstellung von 4 als eine Gleitkommazahl auf 64 Bits beträgt:
0b0100 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
SEEE EEEE EEEE MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM
Es stellt sich heraus, dass dieser Wert 4616189618054758400 als unsigned integer wenn interpretiert wird. Im Internet finden Sie viele großartige Tutorials zum IEEE754, um zu verstehen, wie der obige Wert eine Darstellung von 4 darstellt.
Ich glaube, der Wert, den Sie betrachten, ist Hex. Wenn Sie die Formel für Fließkommadarstellungen kennen (mehr Infos hier https://en.wikipedia.org/wiki/IEEE_floating_point), dann könnten Sie sie theoretisch auf diesen Wert anwenden und es würde Ihnen 4 geben. – evanmcdonnal