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.
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.
__try
/ __catch
-Block in C oder try
/ catch
-Block in C ++ fangen können / li>
_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.
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.
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.
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
Dies berechnet den Unterschied zwischen a
und b
unter Verwendung von 20 Dezimalstellen-Arithmetik, und das Ergebnis ist 0.11E-16
.
Tags und Links floating-point ieee-754 floating-point-exceptions