Ce face math.Frexp
Un float64 este memorat ca o mantisă înmulțită cu o putere a lui 2. math.Frexp(f) desparte numărul în frac (între 0.5 și 1, cu semn) și exp, astfel încât f = frac × 2exp. math.Frexp(8) dă 0.5, 4, pentru că 0.5 × 16 = 8.
math.Ldexp(frac, exp) face operația inversă: calculează frac × 2exp.
math.Logb(x) returnează exponentul binar ca float64, iar math.Ilogb(x) același exponent ca int. Aici mantisa este între 1 și 2, deci Logb(8) este 3 (8 = 1 × 23). Este partea întreagă a lui log2|x|. Aceste funcții sunt folosite rar, în cod numeric de nivel jos.
Parametri
| Parametru | Descriere |
|---|---|
f, x |
Numărul analizat. |
frac, exp |
Pentru Ldexp: mantisa și exponentul puterii lui 2. |
Ce returnează
Frexp: perechea (mantisă, exponent). Ldexp: numărul reconstruit. Logb/Ilogb: exponentul binar.
Exemple
Exemplul 1: Mantisă și exponent
package main
import (
"fmt"
"math"
)
func main() {
for _, x := range []float64{8, 10, 0.75} {
frac, exp := math.Frexp(x)
fmt.Printf("%v = %v * 2^%d\n", x, frac, exp)
}
fmt.Println(math.Ldexp(0.625, 4))
}
Rezultat
8 = 0.5 * 2^4
10 = 0.625 * 2^4
0.75 = 0.75 * 2^0
10
Exemplul 2: Exponentul binar cu Logb și Ilogb
package main
import (
"fmt"
"math"
)
func main() {
for _, x := range []float64{1, 8, 10, 1000} {
fmt.Printf("x = %4v Logb = %v Ilogb = %d\n", x, math.Logb(x), math.Ilogb(x))
}
}
Rezultat
x = 1 Logb = 0 Ilogb = 0
x = 8 Logb = 3 Ilogb = 3
x = 10 Logb = 3 Ilogb = 3
x = 1000 Logb = 9 Ilogb = 9
Greșeli frecvente
- Confunzi intervalele: la
Frexpmantisa este în [0.5, 1), laLogbexponentul corespunde unei mantise în [1, 2). De aceea pentru 8,Frexpdă exponentul 4, iarLogbdă 3.
Comenzi înrudite
math.Log: Logaritmii din Go: Log (natural, baza e), Log10 (baza 10), Log2 (baza 2) și Log1p (ln(1+x) precis lângă 0).math.Float64bits: Transformă un float64/float32 în biții lui IEEE 754 (uint64/uint32) și înapoi, fără nicio conversie a valorii.