2013-08-08 15 views
50

Ich habe über Gleitkomma gelesen und ich verstehe, dass NaN Ergebnisse von Operationen sein können. aber ich kann nicht verstehen, was genau diese Konzepte sind. Was ist die Differenz?Was ist der Unterschied zwischen stillem NaN und NaN?

Welcher kann während der C++ Programmierung produziert werden? Könnte ich als Programmierer ein Programm schreiben, das ein sNaN verursacht?

Antwort

37

Wenn eine Operation zu einem ruhigen NaN führt, gibt es keinen Hinweis darauf, dass etwas ungewöhnlich ist, bis das Programm das Ergebnis überprüft und ein NaN sieht. Das heißt, die Berechnung wird ohne irgendein Signal von der Gleitkommaeinheit (FPU) oder der Bibliothek fortgesetzt, wenn der Gleitkomma in der Software implementiert ist. Ein Signalisierungs-NaN wird ein Signal erzeugen, üblicherweise in Form einer Ausnahme von der FPU. Ob die Ausnahme ausgelöst wird, hängt vom Status der FPU ab.

C++ 11 fügt ein paar Sprache controls over the floating-point environment hinzu und stellt standardized ways to create and test for NaNs zur Verfügung. Ob die Steuerelemente implementiert sind, ist jedoch nicht gut standardisiert, und Gleitkommaausnahmen werden normalerweise nicht genauso abgefangen wie C++ - Standardausnahmen.

In POSIX/Unix-Systemen werden Gleitkommaausnahmen normalerweise mit einem Handler für SIGFPE abgefangen.

+20

Hinzufügen zu: Im Allgemeinen ist der Zweck einer Signalisierung NaN (sNaN) zum Debuggen. Zum Beispiel können Gleitkommaobjekte zu sNaN initialisiert werden. Dann, wenn das Programm einen von ihnen einen Wert vor der Verwendung fehlschlägt, wird eine Ausnahme auftreten, wenn das Programm den sNaN in einer arithmetischen Operation verwendet. Ein Programm wird nicht versehentlich ein sNaN erzeugen; Kein normaler Betrieb erzeugt sNaNs. Sie werden nur speziell für den Zweck einer Signalisierung NaN, nicht als Ergebnis einer Arithmetik erstellt. –

+8

Im Gegensatz dazu sind NaNs für mehr normale Programmierung. Sie können durch normale Operationen erzeugt werden, wenn es kein numerisches Ergebnis gibt (z. B. indem die Quadratwurzel einer negativen Zahl genommen wird, wenn das Ergebnis echt sein muss). Ihr Zweck besteht allgemein darin, die Arithmetik etwas normal ablaufen zu lassen. Z. B. könnten Sie eine große Anzahl von Zahlen haben, von denen einige Sonderfälle darstellen, die nicht normal gehandhabt werden können. Sie können eine komplizierte Funktion aufrufen, um dieses Array zu verarbeiten, und es könnte mit der üblichen Arithmetik auf dem Array arbeiten und NaNs ignorieren. Nachdem es endet, würden Sie die Sonderfälle für mehr Arbeit trennen. –

+0

@wrdieter Vielen Dank, dann erzeugt nur der naive Unterschied eine Ausnahme oder nicht. – JalalJaberi