Das Ergebnis von Go Float32bit() wird nicht erwartet

WBOY
Freigeben: 2024-02-06 09:25:11
nach vorne
1131 Leute haben es durchsucht

Go Float32bit() 结果不是预期的

Frageninhalt

Zum Beispiel: 16777219,0 Dezimalzahl in Bits umgewandelt

16777219 -> 1 0000 0000 0000 0000 0000 0011

mantissa: 23 bit
0000 0000 0000 0000 0000 001

exponent:
24+127 = 151
151 -> 10010111

result shoud be:
0_10010111_000 0000 0000 0000 0000 0001

1001011100000000000000000000001
Nach dem Login kopieren

Aber:

fmt.printf("%b\n", math.float32bits(float32(16777219.0)))

// 1001011100000000000000000000010
Nach dem Login kopieren

Warum wird das Ergebnis von float32bit() nicht erwartet?

Referenz:

  • base-conversion.ro

Update:

fmt.Printf("16777216.0:%b\n", math.Float32bits(float32(16777216.0)))
fmt.Printf("16777217.0:%b\n", math.Float32bits(float32(16777217.0)))
//16777216.0:1001011100000000000000000000000
//16777217.0:1001011100000000000000000000000
fmt.Printf("16777218.0:%b\n", math.Float32bits(float32(16777218.0)))
//16777218.0:1001011100000000000000000000001
fmt.Printf("16777219.0:%b\n", math.Float32bits(float32(16777219.0)))
fmt.Printf("16777220.0:%b\n", math.Float32bits(float32(16777220.0)))
fmt.Printf("16777221.0:%b\n", math.Float32bits(float32(16777221.0)))
//16777219.0:1001011100000000000000000000010
//16777220.0:1001011100000000000000000000010
//16777221.0:1001011100000000000000000000010

fmt.Printf("000:%f\n", math.Float32frombits(0b_10010111_00000000000000000000000))
// 000:16777216.000000
fmt.Printf("001:%f\n", math.Float32frombits(0b_10010111_00000000000000000000001))
// 001:16777218.000000
fmt.Printf("010:%f\n", math.Float32frombits(0b_10010111_00000000000000000000010))
// 010:16777220.000000
fmt.Printf("011:%f\n", math.Float32frombits(0b_10010111_00000000000000000000011))
// 011:16777222.000000
Nach dem Login kopieren

Was sind die Regeln?


Richtige Antwort


go liefert das korrekte Binär-Gleitkomma-Ergebnis nach IEEE-754 – gerundet auf den nächsten Wert, Bindung an gerade Zahlen.

go Programmiersprachenspezifikation

float32     the set of all ieee-754 32-bit floating-point numbers
Nach dem Login kopieren

Dezimal

16777219
Nach dem Login kopieren

ist binär

1000000000000000000000011
Nach dem Login kopieren

Für 32-Bit-IEEE-754-Gleitkomma-Binärdateien beträgt die 24-Bit-Ganzzahlmantisse

100000000000000000000001.1
Nach dem Login kopieren

Auf den nächsten Wert runden, gerade Zahlen werden angegeben

100000000000000000000010
Nach dem Login kopieren

Löschen Sie das implizite eine Bit der 23-Bit-Mantisse, um zu erhalten

00000000000000000000010
Nach dem Login kopieren
package main

import (
    "fmt"
    "math"
)

func main() {
    const n = 16777219
    fmt.printf("%d\n", n)
    fmt.printf("%b\n", n)
    f := float32(n)
    fmt.printf("%g\n", f)
    fmt.printf("%b\n", math.float32bits(f))
}
Nach dem Login kopieren

https://www.php.cn/link/f0bbf5fb2b067fda7b491dc2307411e4

16777219
1000000000000000000000011
1.677722e+07
1001011100000000000000000000010
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDas Ergebnis von Go Float32bit() wird nicht erwartet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!