math.Frexp în Go

Funcții pentru exponentul binar al unui float64: Frexp îl desparte în mantisă și exponent, Ldexp le reunește, Logb și Ilogb dau exponentul.

Sintaxă
import "math"

func Frexp(f float64) (frac float64, exp int)
func Ldexp(frac float64, exp int) float64
func Logb(x float64) float64
func Ilogb(x float64) int

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 Frexp mantisa este în [0.5, 1), la Logb exponentul corespunde unei mantise în [1, 2). De aceea pentru 8, Frexp dă exponentul 4, iar Logb dă 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.