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