Problemsuche beim Debuggen, wie erzeuge ich 1.#QNAN?



  • Hallo,

    ich versuche gerade einen Fehler in einem recht großen und leider extrem unübersichtlichen Projekt zu finden. Ich habe an mehreren Stellen Daten ausgegeben und erhalte an einigen Stellen -1.#IND und an einer Stelle auch -1.#QNAN. Um in etwa abzugrenzen, wo der Fehler liegen könnte, versuche ich gerade herauszufinden, wie ich das Not a number erzeuge. -1.#IND kriege ich als Ergebnis, sobald ich irgendetwas undefiniertes mache, wie z.B. sqrt(-1.0) oder 100/n mit n=0.0.

    Egal, wie sehr ich mich anstrenge und was für Konstrukte ich mir auch baue, es wird entweder -1.#IND oder +-1.#INF. Kann mir vielleicht jemand ein einfaches Codesample posten, welches mir ein Not a Number erzeugt?
    Ich tippe momentan noch stark auf eine ungültige Division - falls es relevant ist, ich rechne mit doubles.

    Gruß



  • http://de.wikipedia.org/wiki/NaN
    http://de.wikipedia.org/wiki/IEEE_754#Keine_Zahl_.28NaN.29

    der häufigste NaN-Grund ist wohl die Quadratwurzel einer negativen Zahl



  • Danke für die Links, hatte auch schon eine Menge gegoogelt, aber so wirklich geholfen hat es mir noch nicht...
    hier mal meine spontanen Testläufe - im richtigen Programm schreibe ich es zwar per fstream in eine Datei, aber das sollte wohl keinen Unterschied machen... in den Kommentaren steht jeweils die Ausgabe.
    Mache ich irgendwo einen Denkfehler?

    double test=1.0;
    	double pinf=1e308*20;
    	double minf=-1e308*20;
    	double n=0.0;
    	double ind;
    
    	cout<<pinf<<endl;	//1.#INF
    	cout<<minf<<endl;	//-1.#INF
    	cout<<pinf*(+0)<<endl;	//-1.#IND
    	cout<<pinf-pinf<<endl;	//-1.#IND
    	cout<<pinf/pinf<<endl;	//-1.#IND
    	cout<<minf/minf<<endl;	//-1.#IND
    	cout<<minf-minf<<endl;	//-1.#IND
    	cout<<n/n<<endl;	//-1.#IND
    	cout<<sqrt(-1*test)<<endl; //-1.#IND
    
    	ind=100*sqrt(n-5.5);
    	cout<<ind<<endl;	//-1.#IND
    	test=n/ind;
    	cout<<test<<endl;	//-1.#IND
    	test=100*(n/ind);
    	cout<<test<<endl;	//-1.#IND
    	test=ind/ind;
    	cout<<test<<endl;	//-1.#IND
    	test=100*(ind/n);
    	cout<<test<<endl;	//-1.#IND
    


  • Also bei mir liefert folgendes QNaN:

    #include <iostream>
    #include <limits>
    
    int main()
    {
        float QInd = std::numeric_limits<float>::quiet_NaN();
        float QNaN = -QInd;
        std::cout << QInd << '\n' << QNaN << '\n';
    
        return 0;    
    }
    

    QInd scheint jedoch auch ein NaN-Wert zu sein, da QInd == QInd false liefert.


Anmelden zum Antworten