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ștestd::isnan(x). - Compilezi cu
-ffast-math: compilatorul presupune că NaN nu există șiisnanpoate returna mereufalse.
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.