it-swarm.com.de

Wie wird nach inf (und | oder) NaN in einer doppelten Variablen gesucht?

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:

  1. Wenn ich als Argumente 0 und 0 übergebe, wird dRes = inf ausgegeben. Aber ich erwartete dRes = NaN oder so ähnlich.
  2. Ist NaN in doppelten Variablen darstellbar? Jede Variable?
  3. Als ich den Datentyp von d1, d2, dRes in int geändert und 0 und 0 übergeben habe, erhielt ich einen Floating exception. Was ist der Unterschied?
  4. Wie kann man überprüfen, ob der Wert einer Variablen gleich inf ist?
19
nakiya
  1. 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. 

  2. Ja. #include <limits>, dann std::numeric_limits<double>::quiet_NaN() . Einige Compiler (z. B. gcc) enthalten auch das NAN-MAKRO IN <cmath> .

  3. Für ganzzahlige Typen gibt es kein NaN oder unendlich. Die Division durch Null für eine ganze Zahl verursacht eine Ausnahme (SIGFPE) .

  4. #include <cmath>, dann std::isinf(x) . Verwenden Sie std::isfinite(x) , um sicherzustellen, dass x nicht NaN oder Unendlich ist.

27
kennytm

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

0
Ben Voigt