Welche Sprachen stellen IEEE 754-Traps dem Entwickler zur Verfügung?

9

Ich würde gerne mit diesen Fallen für Bildungszwecke spielen.

Ein häufiges Problem mit dem Standardverhalten im numerischen Kalkül ist, dass wir das Nan (oder + -inf), das in einer falschen Operation auftrat, "übersehen" haben. Standardverhalten ist die Propagierung durch die Berechnung, aber einige Operationen (wie Vergleiche) unterbrechen die Kette und verlieren den Nan, und der Rest der Behandlung wird fortgesetzt, ohne die Singularität in vorherigen Schritten des Algorithmus zu bestätigen.

Manchmal haben wir Möglichkeiten, auf diese Art von Ereignis zu reagieren: eine Funktion zu verlängern ("0/0 = 12 in meinem Fall") oder in der Zeitbereichssimulation den Schritt wegzuwerfen und mit anderen Einstellungen (wie dem Prädiktor) zu versuchen , die Schrittweite oder was auch immer).

Hier ist meine Frage: Kennen Sie Sprachen, die die IEEE754-Traps für den Entwickler verfügbar machen? Ich habe nicht das Gefühl, mit ASM dafür zu sorgen.

    
nraynaud 30.03.2009, 21:19
quelle

4 Antworten

3

Soweit ich weiß, gibt es zwei Möglichkeiten für die Verarbeitung von Fließkommaausnahmen in C und C ++:

Erstens, wenn Sie Gleitkommaausnahmen deaktivieren / maskieren (was die meisten Umgebungen standardmäßig tun), können Sie durch Aufruf von fetetexcept . Fetestexcept ist in Visual C ++ nicht verfügbar, aber Sie können die Implementierung der MinGW-Laufzeit problemlos stehlen. (Es ist in der Public Domain.) Sobald eine Ausnahme markiert wurde, wird sie erst gelöscht, wenn Sie feclearexcept aufrufen. Sie können also am Ende einer Reihe von Berechnungen fetestexcept aufrufen, um festzustellen, ob einer von ihnen eine Ausnahme ausgelöst hat. Dies gibt Ihnen nicht die Fallen, nach denen Sie gefragt haben, aber es lässt Sie testen, ob Probleme wie NaN oder +/- inf aufgetreten sind und reagieren wie nötig.

Zweitens können Sie Gleitkommaausnahmen aktivieren / deaktivieren, indem Sie feenableexcept in Linux oder _controlfp in Windows. Wie das Betriebssystem eine vom Prozessor generierte Gleitkommaausnahme behandelt, hängt von Ihrem Betriebssystem ab.

  • Unter Linux sendet das Betriebssystem ein SIGFPE-Signal. Sie können also einen Signalhandler installieren, um dies zu erkennen und ein Flag zu setzen, das Ihrer Routine signalisiert, entsprechend zu reagieren.
  • Unter Windows ruft das Betriebssystem die strukturierte Ausnahmebehandlung auf, um die Prozessorausnahme in eine Sprachausnahme zu konvertieren, die Sie mit einem __try / __catch -Block in C oder try / catch -Block in C ++ fangen können / li>
  • Update: Für Mac OS X, wie in diese Antwort , Sie sollten Ausnahmen mit _MM_SET_EXCEPTION_MASK von xmmintrin.h aktivieren / demaskieren können und solange Sie die Standard-Compiler-Optionen verwenden (dh SSE nicht deaktivieren ), sollten Sie Ausnahmen mit SIGFPE abfangen können.

(Ich habe ein bisschen mehr über dieses und andere Gleitkomma-Probleme in C und C ++ in diesen Blogeintrag , wenn Sie neugierig sind.

    
Josh Kelley 31.03.2009 01:04
quelle
0

C und wahrscheinlich die meisten davon abgeleiteten Sprachen wie C ++ oder Python (möglicherweise indirekter Zugriff). Es ist wahrscheinlich vernünftig zu erwarten, dass Low-Level-Sprachen solche Unterstützung haben werden.

Siehe Ссылка , das zahlreiche Skripte und Hinweise zum Arbeiten mit IEEE 754 enthält Zahlen. Insbesondere of1.c behandelt Gleitkommaausnahmen. Schließlich von der Quelle Ссылка , die eine Reihe nützlicher Informationen enthält.

    
Dana the Sane 30.03.2009 21:27
quelle
0

Ich bin unsicher, was der Standard ist, aber ich kann Ihnen sagen, was ich aus Erfahrung gesehen habe, wie es nützlich sein könnte. Ich habe in C ++ codiert und NaN sind manchmal mein schlimmster Albtraum. Sie erscheinen still und propagieren durch die Berechnung den ganzen Weg bis zum Ende, bis ich nur nutzlose Ausgabe habe. Ich musste oft zusätzlichen Code erstellen, um die NaN-verursachenden Umstände spezifisch zu erkennen. Ich benutze Visual C ++ 2008, also erwarte ich, dass es dem IEEE-Standard auf diese Weise folgt.

    
Ray Hidayat 31.03.2009 01:08
quelle
0

Maples Programmiersprache verfügt über ein numerisches Modell, das IEEE-754 berücksichtigt und Ihnen erlaubt, Ihre eigenen Trap-Handler zu setzen, wenn Sie möchten. Hier sind einige Links:

Eine ungewöhnliche Eigenschaft von Maple ist, dass die Standard-Fließkommazahlen dezimal (nicht binär) und von beliebiger Genauigkeit sind. Wenn Sie mit binären 64-Bit-Gleitkommazahlen umgehen möchten, wickeln Sie sie in HFloat ein. Zum Beispiel stellt 0.2 genau die Dezimalzahl dar, während HFloat(0.2) die gleiche Zahl darstellt, die Sie erhalten würden, wenn Sie 0,2 zu einem Doppel in C zuweisen. Dies wird z. B. durch Ausführen von

ersichtlich %Vor%

Dies berechnet den Unterschied zwischen a und b unter Verwendung von 20 Dezimalstellen-Arithmetik, und das Ergebnis ist 0.11E-16 .

    
Erik P. 16.10.2013 18:43
quelle