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).