Ce face math.Inf
Un float64 poate avea trei valori speciale: +Inf, -Inf și NaN (Not a Number). math.Inf(1) dă plus infinit, math.Inf(-1) minus infinit. math.NaN() dă un NaN, rezultatul operațiilor fără sens, ca Sqrt(-1) sau 0/0 calculat la rulare.
math.IsInf(f, sign) verifică infinitul: cu sign > 0 doar +Inf, cu sign < 0 doar -Inf, cu sign == 0 oricare. math.IsNaN(f) verifică NaN.
NaN are o proprietate ciudată: nu este egal cu nimic, nici cu el însuși. x == math.NaN() este mereu false, deci singura verificare corectă este math.IsNaN(x). Infinitul este util ca valoare de pornire când cauți un minim: orice număr real este mai mic decât math.Inf(1).
Parametri
| Parametru | Descriere |
|---|---|
sign |
La Inf: ≥ 0 pentru +Inf, < 0 pentru -Inf. La IsInf: semnul verificat (0 = oricare). |
f |
Numărul verificat. |
Ce returnează
Inf și NaN: valoarea specială. IsInf și IsNaN: true sau false.
Exemple
Exemplul 1: Infinit și NaN
package main
import (
"fmt"
"math"
)
func main() {
plus, minus := math.Inf(1), math.Inf(-1)
fmt.Println(plus, minus, plus+1, -plus == minus)
fmt.Println(math.IsInf(minus, 0), math.IsInf(minus, 1))
n := math.Sqrt(-1)
fmt.Println(n, n == n, math.IsNaN(n))
fmt.Println(math.NaN() == math.NaN())
}
Rezultat
+Inf -Inf +Inf true
true false
NaN false true
false
Exemplul 2: Infinit ca valoare de pornire pentru minim
package main
import (
"fmt"
"math"
)
func main() {
preturi := map[string]float64{"Iași": 7.49, "Cluj": 6.99, "Brașov": 7.15}
minim := math.Inf(1)
for _, p := range preturi {
if p < minim {
minim = p
}
}
fmt.Println("Cel mai mic preț:", minim, "lei")
}
Rezultat
Cel mai mic preț: 6.99 lei
Exemplul 3: Împărțirea la zero la rulare
O împărțire la o variabilă egală cu 0 nu oprește programul pentru float64: dă infinit sau NaN. (Împărțirea unei constante la 0 nu compilează, iar la întregi programul se oprește cu panic.)
package main
import (
"fmt"
"math"
)
func main() {
zero := 0.0
r1, r2 := 5/zero, zero/zero
fmt.Println(r1, r2)
fmt.Println(math.IsInf(r1, 1), math.IsNaN(r2))
}
Rezultat
+Inf NaN
true true
Greșeli frecvente
- Verifici NaN cu
x == math.NaN()saux != xuitând ce înseamnă: folosește întotdeaunamath.IsNaN(x), e mai clar. - Lași un NaN să intre într-o sumă sau o sortare: orice operație cu NaN dă NaN, iar sortarea poate da o ordine neașteptată.
Comenzi înrudite
math.Sqrt: math.Sqrt calculează rădăcina pătrată, iar math.Cbrt rădăcina cubică a unui număr float64.math.Max: math.Max returnează cel mai mare, iar math.Min cel mai mic dintre două numere float64.math.Nextafter: Returnează următorul număr reprezentabil după x, în direcția lui y (float64 sau float32).cmp.Compare: Compare returnează -1, 0 sau +1 după cum x este mai mic, egal sau mai mare decât y; Less spune dacă x < y.