2008-10-25 6 views
7

Nach einer anderen Frage zu SO (Using NaN in C++) wurde ich neugierig auf std::numeric_limits<double>::signaling_NaN().Wie std :: signaling_nan verwenden?

Ich konnte Signalling_NaN nicht erhalten, um eine Ausnahme zu werfen. Ich dachte, vielleicht durch Signalisierung es wirklich ein Signal, also versuchte ich meinte SIGFPE fangen aber nee ...

Hier ist mein Code:

double my_nan = numeric_limits<double>::signaling_NaN(); 
my_nan++; 
my_nan += 5; 
my_nan = my_nan/10; 
my_nan = 15/my_nan; 
cout << my_nan << endl; 

numeric_limits<double>::has_signaling_NaN den Wert true, so wird es auf meinem System implementiert.

Irgendwelche Ideen?

Ich benutze ms Visual Studio. NET 2003 C++ - Compiler. Ich möchte es auf einem anderen testen, wenn ich nach Hause komme.

Danke!

+0

Ich nehme an, my_nan und num sollen die gleiche Variable sein. Wenn ja, repariere das bitte. – Motti

Antwort

5

Mit der Funktion _control87() können Sie Gleitkommaausnahmen aktivieren. Aus der MSDN-Dokumentation auf _control87():

Hinweis:

Die Laufzeitbibliotheken maskieren alle Gleitkommazahlen Ausnahmen standardmäßig.

Wenn Gleitkomma-Ausnahmen aktiviert sind, können Sie signal() oder SEH (Structured Exception Handling) verwenden, sie zu fangen.

0

Von TFM:

cout << "The signaling NaN for type float is: " 
    << numeric_limits<float>::signaling_NaN() 
    << endl; 

->

Die Signalisierung NaN für Typ float: 1. # QNAN

, wo die 'Q' steht für 'Quiet' . Weiß nicht, warum es das zurückgeben würde, aber deshalb gibt es keine Ausnahme für dich.

Aus Neugier, funktioniert das besser?

const double &real_snan(void) 
{ 
    static const long long snan = 0x7ff0000080000001LL; 
    return *(double*)&snan; 
} 
5

Ein Wort der Warnung: Das Verwenden von DLLs von Drittanbietern kann diese Ausnahmen im Hintergrund aktivieren. Dies gilt insbesondere für das Laden von DLLs, die in einer Sprache geschrieben sind, die sie standardmäßig aktiviert.

Ich hatte das in zwei Fällen: Drucken von einem eingebetteten Browser-Steuerelement auf einen HP-Drucker und Registrierung meiner DLL (die einige Anfangswerte auf NaN setzt) ​​von InnoSetup, das in Delphi geschrieben ist.

+1

Ich weiß umgekehrten Fall beim Aufruf externer DLL deaktiviert sie. Ab diesem Zeitpunkt sind alle FPU-Ausnahmen maskiert. Also habe ich kein Wissen über mögliche Fehler im Programm. Solche schlecht geschriebenen Dinge sind Schande. Alle Drittanbieter-DLLs sollten Gleitkommaausnahmemasken auf vorherige Werte zurücksetzen. – truthseeker

Verwandte Themen