Frage

Nachdem Sie sich eine andere Frage angesehen haben (Verwenden von NAN in C ++) Ich wurde neugierig std::numeric_limits<double>::signaling_NaN().

Ich konnte Signaling_nan nicht bekommen, um eine Ausnahme zu machen. Ich dachte, vielleicht bedeutete es wirklich ein Signal, also habe ich versucht, Sigfpe zu fangen, aber nein ...

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 Evaluiert auf True, daher wird es in meinem System implementiert.

Irgendwelche Ideen?

Ich verwende den C ++ - Compiler von MS Visual Studio .NET 2003. Ich möchte es an einem anderen testen, wenn ich nach Hause komme.

Vielen Dank!

War es hilfreich?

Lösung

Du kannst den ... benutzen _control87() Funktion zur Aktivierung von Ausnahmen von Gleitpunkten. Aus der MSDN -Dokumentation auf _control87():

Notiz:

Die Laufzeitbibliotheken maskieren standardmäßig alle schwimmenden Punktausnahmen.

Wenn die Ausnahmen der schwimmenden Punkte aktiviert sind, können Sie verwenden signal() oder SEH (strukturierte Ausnahmebehandlung) sie fangen.

Andere Tipps

Ein Wort der Warnung: Die Verwendung von DLLs von Drittanbietern kann diese Ausnahmen stillschweigend ermöglichen. Dies gilt insbesondere für das Laden von DLLs, die in einer Sprache geschrieben sind, die sie standardmäßig ermöglicht.

Ich habe das in zwei Fällen geschehen: Drucken von einem eingebetteten Browser -Steuerelement zu einem HP -Drucker und Registrieren meiner DLL (die einige Anfangswerte auf NAN festlegt) von InnoSetup, das in Delphi geschrieben ist.

Der Schlüssel liegt in numeric_limits<T>::has_signaling_NaN. Welchen Wert hat das für Sie? (Die MSDN scheint darauf hinzudeuten, dass es immer ist false für MSVC?)

Aus Tfm:

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

->

Die Signal -Nan für den Typ float lautet: 1.#qnan

Wo das 'Q' für 'Quiet' steht. Keine Ahnung, warum es das zurückgeben würde, aber deshalb macht es keine Ausnahme für Sie.

Funktioniert dies aus Neugier?

const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top