Das Steuerwortregister des mathematischen Koprozessors
(FPU = Float Processing Unit)
Der Ablauf von Rechenoperationen mit Gleitkommazahlen wird durch dieses
Register gesteuert.
Im Wesentlichen wird hier eingestellt, ob Ausnahmefehler behandelt werden
oder nicht.
Viele Anwendungen und DLLs verändern beim Laden die Einstellung entsprechend
ihren Anforderungen. Ob die Voreinstellung dabei gesichert und nach
dem Beenden wieder zurückgesetzt wird, ist lediglich eine Frage der Hygiene.
Invalid Operation Exception
Ungültige Gleitkommaoperation
Dieser Schalter ist per Voreinstellung deaktiviert, so dass alle
unbehandelten Ausnahmen einen Fehler ausgelösen.
Die Ausnahme tritt bei einer nicht definierten Anweisung, einer ungültigen
Rechenoperation oder einem Gleitkommastapelüberlauf (stack overflow) ein.
Denormalized Operand Exception
Fehler durch denormalisierten Operanden
Dieser Schalter ist per Voreinstellung aktiviert, so dass kein Fehler
ausgelöst wird.
Die Ausnahme tritt bei einer Rechenoperation mit den denormalisierten
Operanden NAN (Not a Number) oder
INF (Infinity) ein.
Zero Divide Exception
Fehler bei Teilung durch Null
Dieser Schalter ist per Voreinstellung deaktiviert, weil das Ergebnis
mathematisch nicht definiert ist.
Die FPU löst einen Ausnahmefehler aus und gibt den Wert
NAN (Not a Number) zurück.
Wird die Ausnahmebehandlung dagegen aktiviert, ist das Resultat der
Wert INF (Infinity).
Der Aufrufer übernimmt die weitere Behandlung dieses denormalisierten
Operanden.
Overflow Exception
Gleitkommaüberlauf
Dieser Schalter ist per Voreinstellung deaktiviert, weil bei einem
Registerüberlauf Daten verloren gehen, wenn ein Berechnungsergebnis größer
ist, als es der durch die eingeschränkte Genauigkeit bestimmte,
signifikante Bereich zulässt.
Ein Ausnahmefehler wird ausgelöst und der Wert
NAN (Not a Number)
zurückgegeben.
Wird die Ausnahmebehandlung dagegen aktiviert, dann wird kein Fehler
ausgelöst.
Das Resultat ist der Wert INF
(Infinity).
Der Aufrufer übernimmt die weitere Behandlung dieses denormalisierten
Operanden.
Underflow Exception
Gleitkommaunterlauf
Dieser Schalter ist per Voreinstellung aktiviert, so dass kein Fehler
ausgelöst wird, sondern 0 als Ergebnis geliefert wird.
Ein Gleitkommaunterlauf tritt auf, wenn das Ergebnis einer Rechenoperation
zu klein ist, um es in dem durch die eingeschränkte Genauigkeit
bestimmten, signifikanten Bereich abzubilden.
Wird die Ausnahmebehandlung deaktiviert, dann wird ein Fehler
ausgelöst, und das Steuerwort anschließend zurück gesetzt.
Precision Exception
Rechengenauigkeitsfehler
Dieser Schalter ist per Voreinstellung aktiviert, so dass kein Fehler
ausgelöst wird.
Exception Interrupt Disabled
Ausnahmebehandlung deaktiviert
Die Ausnahmebehandlung kann als Ganzes abgeschaltet werden.
Precision Control Low Bit
Precision Control High Bit
Die aktuelle Rechengenauigkeit kann festgestellt oder geändert
werden. Sie kann einen der folgenden Werte annehmen.
Single
24 Bit
Double
53 Bit
Extended
64 Bit (Voreinstellung)
Round Control Low Bit
Round Control High Bit
Next or even value
Symmetrische Rundung / Bankers' Rounding (Voreinstellung)
Werte werden zur nächstliegenden ganzen Zahl gerundet.
Werte, welche genau auf der Hälfte zwischen zwei ganzen Zahlen liegen,
werden zur nächsten geraden Zahl gerundet.
Truncate
Nachkommastellen abschneiden
Das Rundungsergebnis wird durch Abschneiden der Nachkommastellen
ermittelt. Dies entspricht also der Rundung gegen
Unendlich.
Positive infinity
Rundung gegen +Unendlich
Alle Werte werden zur nächsten größeren ganzen Zahl gerundet.
Negative infinity
Rundung gegen Unendlich
Alle Werte werden zur nächsten kleineren ganzen Zahl gerundet.
Asymmetrische Rundung / Kaufmännische Rundung
Bei diesem Verfahren werden - wie bei der Symmetrischen Rundung - alle
Werte zur nächstliegenden ganzen Zahl gerundet.
Werte, welche genau auf der Hälfte zwischen zwei ganzen Zahlen liegen,
werden allerdings immer zur nächsten
größeren Zahl
gerundet.
Die FPU stellt kein Verfahren zur Asymmetrischen Rundung bereit.
Die folgende Routine rundet asymmetrisch und wird nicht von der
Einstellung des Steuerwortregisters beeinflusst.
//------------------------------------------------------------------------------
function RoundJustified(aValue: Extended): integer;
begin
Result := Trunc( aValue ) + Trunc( 2 * Frac( aValue ) );
if ( aValue < 0 ) then
// Negative values...
if ( ( Frac( aValue ) * 1000000000 ) = -500000000 ) then
// Justify...
Inc( Result );
end; // RoundJustified
Infinity Control
Affine model
Die Zahlen liegen auf einem Strahl von Unendlich bis
+Unendlich.
Projective model
Die Zahlen liegen auf einem Kreis, wobei Unendlich gleich
+Unendlich ist.