std::isnan în C++

Verifică dacă un număr cu virgulă este NaN (rezultat nedefinit) sau infinit (inf).

Sintaxă
bool isnan(double x);
bool isinf(double x);

Ce face std::isnan

Calculele cu numere cu virgulă nu opresc programul la operații imposibile, ci produc valori speciale: inf (infinit, de exemplu la 1.0 / 0.0 sau la depășire) și NaN („not a number”, de exemplu la sqrt(-1) sau 0.0 / 0.0).

std::isnan și std::isinf recunosc aceste valori. NaN are o proprietate ciudată: nu este egal cu nimic, nici cu el însuși, deci x == NaN este mereu fals. Pentru „număr obișnuit” există std::isfinite.

Parametri

Parametru Descriere
x Valoarea verificată.

Ce returnează

true sau false.

Exemple

Exemplul 1: Valori speciale

#include <cmath>
#include <print>

int main() {
    double zero = 0.0;
    double minus_unu = -1.0;

    double infinit = 1.0 / zero;
    double nedefinit = std::sqrt(minus_unu);

    std::println("{} {}", infinit, nedefinit);
    std::println("isinf: {}, isnan: {}", std::isinf(infinit), std::isnan(nedefinit));
    std::println("NaN == NaN: {}", nedefinit == nedefinit);
    std::println("isfinite(3.5): {}", std::isfinite(3.5));
}

Rezultat

inf nan
isinf: true, isnan: true
NaN == NaN: false
isfinite(3.5): true

Exemplul 2: Validarea unui rezultat

#include <cmath>
#include <print>

double medie(double suma, int numar) {
    return suma / numar;
}

int main() {
    for (int numar : {4, 0}) {
        double m = medie(0.0, numar);
        if (std::isnan(m) || std::isinf(m)) {
            std::println("Media nu se poate calcula pentru {} elemente", numar);
        } else {
            std::println("Media: {}", m);
        }
    }
}

Rezultat

Media: 0
Media nu se poate calcula pentru 0 elemente

Greșeli frecvente

  • Verifici NaN cu x == std::numeric_limits<double>::quiet_NaN(): este mereu fals. Folosește std::isnan(x).
  • Compilezi cu -ffast-math: compilatorul presupune că NaN nu există și isnan poate returna mereu false.

Comenzi înrudite

  • std::numeric_limits: Dă proprietățile unui tip numeric: valoarea maximă și minimă, precizia, dacă are semn, infinitul.
  • std::sqrt: Calculează rădăcina pătrată (sqrt) sau rădăcina cubică (cbrt) a unui număr.
  • std::fmin: Returnează minimul (fmin) sau maximul (fmax) a două numere cu virgulă, ignorând o valoare NaN.
  • std::log: Calculează logaritmul natural (log), în baza 10 (log10) sau în baza 2 (log2) al unui număr pozitiv.