Frage

Es ist oft schwer, die Herkunft eines NaN zu finden, da es sich bei jedem Schritt einer Berechnung und propagiert passieren kann. So ist es möglich, ein C ++ Programm halt zu machen, wenn eine Berechnung NaN oder Inf zurückkehrt? Die best meiner Meinung nach einem Absturz mit einer netten Fehlermeldung zu haben wäre:

Foo: NaN encoutered at Foo.c:624

Ist so etwas möglich? Haben Sie eine bessere Lösung? Wie debuggen Sie NaN Probleme?

EDIT: Präzisierungen. Ich arbeite mit GCC unter Linux

War es hilfreich?

Lösung

Sie können es nicht in eine völlig tragbaren Art und Weise, aber viele Plattformen bieten C-APIs, die es Ihnen ermöglichen, die Gleitkommastatussignale Steuerregister zuzugreifen (s).

Insbesondere möchten Sie den Überlauf und ungültige Gleitkommazahlen Ausnahmen demaskieren, die den Prozessor dazu veranlassen wird eine Ausnahme, wenn Arithmetik in Ihrem Programm zu signalisieren, eine NaN oder unendlich Ergebnis führt.

auf Ihrem Linux-System soll dies den Trick tun:

#include <fenv.h> 
...
feenableexcept(FE_INVALID | FE_OVERFLOW);

Sie möchten lernen, einen Trap-Handler zu schreiben, so dass Sie eine Diagnosemeldung Ausführung gedruckt werden kann oder auf andere Weise fortgesetzt werden, wenn eine dieser Ausnahmen signalisiert wird.

Andere Tipps

Ja! Set (vielleicht mehr oder weniger portabel) Ihr IEEE 754-konformen Prozessor eine Unterbrechung zu erzeugen, wenn ein NaN oder unendlich angetroffen wird.

ich gegoogelt und gefunden diese Folien , die sind ein Anfang. Der Schieber auf Seite 5 fasst alle Informationen, die Sie benötigen.

Ich bin kein C-Experte, aber ich erwarte, dass die Antwort nein ist.

  1. Dies würde jeden Schwimmer Berechnung erfordert diese Prüfung zu haben. Eine große Auswirkungen auf die Leistung.
  2. NaN und Inf sind nicht böse. Sie können zu Recht in irgendeiner Bibliothek verwendet werden, um Ihre App verwendet, und brechen sie.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top