math.Float64bits în Go

Transformă un float64/float32 în biții lui IEEE 754 (uint64/uint32) și înapoi, fără nicio conversie a valorii.

Sintaxă
import "math"

func Float64bits(f float64) uint64
func Float64frombits(b uint64) float64
func Float32bits(f float32) uint32
func Float32frombits(b uint32) float32

Ce face math.Float64bits

math.Float64bits(f) returnează exact cei 64 de biți din memorie ai lui f, ca un uint64: 1 bit de semn, 11 biți de exponent și 52 de biți de mantisă (standardul IEEE 754). math.Float64frombits(b) face operația inversă.

math.Float32bits și math.Float32frombits sunt variantele pentru float32 (32 de biți: 1 + 8 + 23).

Nu confunda cu conversia uint64(f), care schimbă valoarea (taie zecimalele). Aceste funcții păstrează biții, nu valoarea. Le folosești la formate binare, la salvarea exactă a unui număr sau ca să înțelegi cum sunt memorate numerele.

Parametri

Parametru Descriere
f Numărul cu virgulă mobilă.
b Biții, ca întreg fără semn.

Ce returnează

Biții (uint64/uint32) sau numărul reconstruit (float64/float32).

Exemple

Exemplul 1: Biții câtorva numere

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Printf("1.0   -> %#016x\n", math.Float64bits(1.0))
    fmt.Printf("-2.0  -> %#016x\n", math.Float64bits(-2.0))
    fmt.Printf("1.0 (float32) -> %#08x\n", math.Float32bits(1.0))
    f := 3.75
    fmt.Println(uint64(f), math.Float64bits(f))
}

Rezultat

1.0   -> 0x3ff0000000000000
-2.0  -> 0xc000000000000000
1.0 (float32) -> 0x3f800000
3 4615626668101337088

Exemplul 2: Dus-întors și cele trei părți ale numărului

Bitul 63 este semnul, următorii 11 biți sunt exponentul (memorat cu 1023 adunat). -6.5 = -1.625 × 22. Ultimul rând citește biții lui π ca float32.

package main

import (
    "fmt"
    "math"
)

func main() {
    x := -6.5
    b := math.Float64bits(x)
    semn := b >> 63
    exponent := (b>>52)&0x7FF - 1023
    fmt.Println("semn:", semn, "exponent:", exponent)
    fmt.Println("înapoi:", math.Float64frombits(b))
    fmt.Println(math.Float32frombits(0x40490fdb))
}

Rezultat

semn: 1 exponent: 2
înapoi: -6.5
3.1415927

Greșeli frecvente

  • Folosești uint64(f) când voiai biții: conversia schimbă valoarea (uint64(3.75) este 3).

Comenzi înrudite

  • math.Frexp: Funcții pentru exponentul binar al unui float64: Frexp îl desparte în mantisă și exponent, Ldexp le reunește, Logb și Ilogb dau exponentul.
  • math.Nextafter: Returnează următorul număr reprezentabil după x, în direcția lui y (float64 sau float32).
  • unsafe.Sizeof: Returnează câți octeți ocupă în memorie o valoare de tipul lui x, fără memoria la care trimite (constantă la compilare).