2012-04-12 4 views
1

Ich möchte das Verhalten isolieren, wenn einige double Wert ist ein NaN oder ein #INF. Um einen NaN zu erkennen, ich testeC++ Test, ob Doppel ist #INF

doubleVal != doubleVal 

Was ist ein #INF? Wird dieser Test wahr sein, wenn der doubleVal ein #INF ist?

Antwort

4

Wie wäre Multiplikation mit 1. wenn du dir sicher bist, dass es nicht NaN ist?

http://ideone.com/97FNu

Sie auch isinf und isnan, verwenden könnte, aber diejenigen, könnten einige Overhead je nach deren Umsetzung entstehen.

Eine dritte Alternative wird unter Verwendung des C max -Wert von Makros (oder gleichwertig std::numeric_limits):

bool is_inf_or_nan(double x) 
{ 
    return !(x <= DBL_MAX && x >= -DBL_MAX); 
}  
+0

Ich mag diese alternative Lösung – octoback

3

Wenn Sie nicht C++ 11 verwenden, benötigen Sie <boost/math/special_functions/fpclassify.hpp> anstelle von <cmath>, mit entsprechenden Namespace-Änderung.

#include <cmath> // or <boost/math/special_functions/fpclassify.hpp> 
// ... 

    if(isinf(num)){ 
     // ... 
    } 
+1

Auch Sie wahrscheinlich 'std :: isnan' verwenden sollten für NaN zu überprüfen, wenn auch nur, weil es deutlicher ist. – James

3

Es gibt auch eine header-only library in-Boost, die ordentlich Werkzeuge mit Floating-Point-Datentypen

#include <boost/math/special_functions/fpclassify.hpp> 

Sie erhalten die folgenden Funktionen beschäftigen:

template <class T> bool isfinite(T z); 
template <class T> bool isinf(T t); 
template <class T> bool isnan(T t); 
template <class T> bool isnormal(T t);