math.Inf în Go

Valorile speciale ale lui float64: infinit (Inf, IsInf) și „nu este un număr” (NaN, IsNaN).

Sintaxă
import "math"

func Inf(sign int) float64
func IsInf(f float64, sign int) bool
func NaN() float64
func IsNaN(f float64) (is bool)

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() sau x != x uitând ce înseamnă: folosește întotdeauna math.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.