Test8087CW 2.0 - Dokumentation [2004-04-24]
Das Steuerwortregister des mathematischen Koprozessors (FPU = Float Processing Unit)
Steuerung von Gleitkommaoperationen
Behandlung von Ausnahmen (Exceptions)
Rechengenauigkeit
Rundungsmodus
Zahlenmodell
Screenshot
Steuerung von Gleitkommaoperationen
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.
Behandlung von Ausnahmen (Exceptions)
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.
Rechengenauigkeit
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)
Rundungsmodus
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

Zahlenmodell
Infinity Control
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.