2016-06-09 15 views
7

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; 
??? 
+2

Si intendono funzioni come ['std :: isnan'] (http://en.cppreference.com/w/cpp/numeric/math/isnan)? Questo è C++ 11 ma fa il lavoro. – tadman

+2

Hai visto [std :: isfinite] (http://en.cppreference.com/w/cpp/numeric/math/isfinite) e le relative funzioni? –

+0

intendi un numero * reale *?Perché un numero è vero se è diverso da 0.0 –

risposta

7

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.

5

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.

+3

Non penso che tu voglia "&&" qui. –

+0

@ n.m. naturalmente no .. grazie – user463035818

+3

Sei sicuro che i subnormali non sono numeri "* true *" per OP? – user2079303

1

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:

  1. f == f sarà falsesolo per il caso NaN.

  2. Qualcosa del modulo f == f/2 sarà truesolo 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

+0

'isnan' restituisce false per' inf' – user463035818

+1

Dovresti probabilmente menzionare che il pre-C++ I metodi 11 sono garantiti da IEEE-754 ma non dallo standard C++. – user2079303

1

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 di arg.

Problemi correlati