Come verificare se un numero fisso è un numero vero? Cioè: non è l'infinito, infinito negativo, NaN ...Come verificare se un float è un numero vero in C++?
float f;
???
Come verificare se un numero fisso è un numero vero? Cioè: non è l'infinito, infinito negativo, NaN ...Come verificare se un float è un numero vero in C++?
float f;
???
semplice che std::fpclassify()
è utilizzare std::isfinite()
determina se il dato numero virtuale punto arg ha valore finito cioè esso è normale, subnormale o nullo, ma non infinito o NaN.
std::isnormal() fa ciò che si vuole, ma controlla anche per la 0.0. Così si potrebbe verificare che caso in più:
float f;
bool isNumber = (std::isnormal(f) || f == 0.0);
Edit: come sottolineato da user2079303 isnormal
restituisce anche false per un subnormal number che il PO probabilmente non vuole.
Tuttavia, forse std::isfinite fa la cosa giusta.
float f;
bool isNumber = std::isfinite(f) ;
restituisce false
per NaN
e Inf
.
Non penso che tu voglia "&&" qui. –
@ n.m. naturalmente no .. grazie – user463035818
Sei sicuro che i subnormali non sono numeri "* true *" per OP? – user2079303
Per C++ 11 e successivi, utilizzare !std::isnan(f) && !std::isinf(f)
per verificare che un numero non sia né NaN né infinito (positivo o negativo).
Pre-C++ 11 è un po 'più difficile, ma è ancora possibile farlo. Se la piattaforma utilizza IEEE754 per la float
quindi è possibile utilizzare:
f == f
sarà false
solo per il caso NaN.
Qualcosa del modulo f == f/2
sarà true
solo per l'infinito o un numero vicino a zero, e si può banalmente eliminare il secondo caso.
Boost (www.boost.org) fornisce anche metodi per pre C++ 11. Vedi http://www.boost.org/doc/libs/1_41_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fpclass.html
'isnan' restituisce false per' inf' – user463035818
Dovresti probabilmente menzionare che il pre-C++ I metodi 11 sono garantiti da IEEE-754 ma non dallo standard C++. – user2079303
std::fpclassify() sembra quello che stai cercando.
int fpclassify(float arg); int fpclassify(double arg); int fpclassify(long double arg); int fpclassify(Integral arg);
valore di ritorno
uno dei
FP_INFINITE
,FP_NAN
,FP_NORMAL
,FP_SUBNORMAL
,FP_ZERO
o tipo di implementazione definito, specificando la categoria diarg
.
Si intendono funzioni come ['std :: isnan'] (http://en.cppreference.com/w/cpp/numeric/math/isnan)? Questo è C++ 11 ma fa il lavoro. – tadman
Hai visto [std :: isfinite] (http://en.cppreference.com/w/cpp/numeric/math/isfinite) e le relative funzioni? –
intendi un numero * reale *?Perché un numero è vero se è diverso da 0.0 –