math.Nextafter în Go

Returnează următorul număr reprezentabil după x, în direcția lui y (float64 sau float32).

Sintaxă
import "math"

func Nextafter(x, y float64) (r float64)
func Nextafter32(x, y float32) (r float32)

Ce face math.Nextafter

Numerele cu virgulă mobilă nu sunt continue: între 1 și următorul float64 există un mic gol. math.Nextafter(x, y) returnează valoarea reprezentabilă imediat după x, mergând spre y. Dacă x == y, returnează x.

math.Nextafter32 face același lucru pentru float32, unde golurile sunt mult mai mari. Funcțiile arată cât de precisă este reprezentarea și sunt folosite la teste numerice și la toleranțe.

Parametri

Parametru Descriere
x Numărul de pornire.
y Direcția: un număr mai mare (în sus) sau mai mic (în jos).

Ce returnează

Următoarea valoare reprezentabilă de același tip.

Exemple

Exemplul 1: Cât de mare este golul după 1

package main

import (
    "fmt"
    "math"
)

func main() {
    sus := math.Nextafter(1, 2)
    jos := math.Nextafter(1, 0)
    fmt.Println(sus, jos)
    fmt.Println(sus - 1)
    fmt.Println(math.Nextafter32(1, 2))
}

Rezultat

1.0000000000000002 0.9999999999999999
2.220446049250313e-16
1.0000001

Exemplul 2: Golul crește cu mărimea numărului

package main

import (
    "fmt"
    "math"
)

func main() {
    for _, x := range []float64{1, 1000, 1e16} {
        fmt.Printf("după %g urmează %g (gol %g)\n", x, math.Nextafter(x, math.Inf(1)), math.Nextafter(x, math.Inf(1))-x)
    }
}

Rezultat

după 1 urmează 1.0000000000000002 (gol 2.220446049250313e-16)
după 1000 urmează 1000.0000000000001 (gol 1.1368683772161603e-13)
după 1e+16 urmează 1.0000000000000002e+16 (gol 2)

Greșeli frecvente

  • Crezi că float64 poate reprezenta orice număr întreg mare: peste 253 (aproximativ 9e15) golul este mai mare ca 1, iar unele întregi nu mai pot fi memorate exact.

Comenzi înrudite

  • math.Float64bits: Transformă un float64/float32 în biții lui IEEE 754 (uint64/uint32) și înapoi, fără nicio conversie a valorii.
  • math.Inf: Valorile speciale ale lui float64: infinit (Inf, IsInf) și „nu este un număr” (NaN, IsNaN).