Betrachten Sie den folgenden Code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
template<class T>
bool IsNaN(T t)
{
return t != t;
}
int main(int argc, char**argv)
{
double d1, d2;
sscanf(argv[1], "%f", &d1);
sscanf(argv[2], "%f", &d2);
double dRes = d1/d2;
cout << "dRes = " << dRes << "\n";
if(IsNaN(dRes))
cout << "Is NaN\n";
else
cout << "Not NaN\n";
}
Paar fragen:
dRes = inf
ausgegeben. Aber ich erwartete dRes = NaN
oder so ähnlich.Floating exception
. Was ist der Unterschied?inf
ist?Bei Verwendung von scanf()
sollte double
mit %lf
und nicht %f
gelesen werden. %f
konvertiert die Eingabe in eine 32-Bit float
, sodass die ersten 32 Bits Ihrer Variablen mit ungültigen Daten gefüllt werden und die letzten 32 Bits als Papierkorb verbleiben.
Ja. #include <limits>
, dann std::numeric_limits<double>::quiet_NaN()
. Einige Compiler (z. B. gcc) enthalten auch das NAN
-MAKRO IN <cmath>
.
Für ganzzahlige Typen gibt es kein NaN oder unendlich. Die Division durch Null für eine ganze Zahl verursacht eine Ausnahme (SIGFPE) .
#include <cmath>
, dann std::isinf(x)
. Verwenden Sie std::isfinite(x)
, um sicherzustellen, dass x
nicht NaN oder Unendlich ist.
Mit der Funktion fpclassify
können Sie einen Gleitkommawert für alle Sonderfälle untersuchen.
Es ist in <math.h>
als Makro seit C99 und in <cmath>
als Funktionsfamilie für float
, double
und long double
unter dem überladenen Namen std::fpclassify
seit C++ 11 enthalten.
cppreference hat ein schönes Beispiel