Gleitkommaregeln (Direct3D 10)

Direct3D 10 unterstützt mehrere verschiedene Gleitkommadarstellungen. Alle Gleitkommaberechnungen werden unter einer definierten Teilmenge des Gleitkommaverhaltens von IEEE 754 mit 32-Bit-Einzelgenauigkeit ausgeführt.

32-Bit-Floating-Point-Regeln

Es gibt zwei Sätze von Regeln: diejenigen, die IEEE-754 entsprechen, und solche, die vom Standard abweichen.

Ehrte IEEE-754-Regeln

Einige dieser Regeln sind eine einzelne Option, bei der IEEE-754 Auswahlmöglichkeiten bietet.

  • Dividieren durch 0 erzeugt +/- INF, mit Ausnahme von 0/0, was zu NaN führt.
  • log of (+/-) 0 erzeugt -INF. das Protokoll eines negativen Werts (außer -0) erzeugt NaN.
  • Reziproke Quadratwurzel (rsq) oder Quadratwurzel (sqrt) einer negativen Zahl erzeugt NaN. Die Ausnahme ist -0; sqrt(-0) erzeugt -0 und rsq(-0) erzeugt -INF.
  • INF – INF = NaN
  • (+/-) INF / (+/-)INF = NaN
  • (+/-) INF * 0 = NaN
  • NaN (any OP) any-value = NaN
  • Die Vergleiche EQ, GT, GE, LT und LE, wenn einer oder beide Operanden naN ist, gibt FALSE zurück.
  • Vergleiche ignorieren das Vorzeichen 0 (sodass +0 gleich -0 ist).
  • Der Vergleichs-NE, wenn einer oder beide Operanden NaN ist, gibt TRUE zurück.
  • Vergleiche von Nicht-NaN-Werten mit +/- INF geben das richtige Ergebnis zurück.

Abweichungen oder zusätzliche Anforderungen von IEEE-754-Regeln

  • IEEE-754 erfordert Gleitkommaoperationen, um ein Ergebnis zu erzeugen, das dem nächsten darstellbaren Wert zu einem unendlich präzisen Ergebnis entspricht, das als Round-to-Nearest-Even bezeichnet wird. Direct3D 10 definiert jedoch eine lockerere Anforderung: 32-Bit-Gleitkommaoperationen erzeugen ein Ergebnis, das innerhalb einer einheitsletzten Stelle (1 ULP) des unendlich präzisen Ergebnisses liegt. Dies bedeutet, dass hardware beispielsweise erlaubt ist, Ergebnisse auf 32-Bit abzuschneiden, anstatt round-to-nearest-even durchzuführen, da dies zu einem Fehler von höchstens einem ULP führen würde.
  • Es gibt keine Unterstützung für Gleitkommaausnahmen, status Bits oder Traps.
  • Normalwerte werden bei Eingabe und Ausgabe beliebiger mathematischer Gleitkommaoperationen in beibehaltene Nullen geleert. Ausnahmen werden für alle E/A- oder Datenverschiebungsvorgänge vorgenommen, die die Daten nicht bearbeiten.
  • Zustände, die Gleitkommawerte enthalten, z. B. Viewport MinDepth/MaxDepth, BorderColor-Werte usw., können als denormierte Werte bereitgestellt werden und vor der Verwendung durch die Hardware geleert werden.
  • Min- oder max.-Vorgänge leeren für vergleichsweisen Denormale, aber das Ergebnis kann denormiert werden oder nicht.
  • Die NaN-Eingabe für einen Vorgang erzeugt bei der Ausgabe immer NaN, aber das genaue Bitmuster des NaN muss nicht gleich bleiben (es sei denn, der Vorgang ist eine unformatierte Verschiebungsanweisung, die die Daten überhaupt nicht ändert.)
  • Min- oder max.-Vorgänge, für die nur ein Operand NaN ist, geben den anderen Operanden als Ergebnis zurück (entgegen den obigen Vergleichsregeln). Dies ist eine neue IEEE-Regel (IEEE 754R), die in Direct3D 10 erforderlich ist.
  • Eine weitere neue IEEE 754R-Regel ist, dass min(-0,+0) == min(+0,-0) == -0 und max(-0,+0) == max(+0,-0) == +0, die das Zeichen im Gegensatz zu den Vergleichsregeln für signierte Null (oben angegeben) berücksichtigen. Direct3D 10 empfiehlt hier das IEEE 754R-Verhalten, wird aber nicht erzwungen. Es ist zulässig, dass das Ergebnis des Vergleichs von Nullen von der Reihenfolge der Parameter abhängig ist, wobei ein Vergleich verwendet wird, der die Zeichen ignoriert.
  • x*1.0f führt immer zu x (außer entnormt geleert).
  • x/1.0f führt immer zu x (außer entnormt geleert).
  • x +/- 0,0f führt immer zu x (außer denormiert geleert). Aber -0 + 0 = +0.
  • Fusionsoperationen (z. B. mad, dp3) erzeugen Ergebnisse, die nicht weniger genau sind als die schlechteste mögliche Reihenreihenfolge der Auswertung der ungefügten Erweiterung des Vorgangs. Beachten Sie, dass die Definition der schlechtesten möglichen Reihenfolge im Sinne der Toleranz keine feste Definition für einen gegebenen Fusionsvorgang ist; dies hängt von den jeweiligen Werten der Eingaben ab. Die einzelnen Schritte in der unfundierten Erweiterung sind jeweils zulässig 1 ULP-Toleranz (oder für anweisungen, die Direct3D 10 mit einer laxen Toleranz als 1 ULP aufruft, ist die laxe Toleranz zulässig).
  • Fused-Vorgänge befolgen dieselben NaN-Regeln wie nicht verschmolzene Vorgänge.
  • Multiplizieren und dividieren sie jeweils mit der 32-Bit-Gleitkommagenauigkeit (Genauigkeit auf 1 ULP).

16-Bit-Floating-Point-Regeln

Direct3D 10 unterstützt auch 16-Bit-Darstellungen von Gleitkommazahlen.

Format:

  • 1 Vorzeichenbit (s) in der MSB-Bitposition
  • 5 Bits des voreingenommenen Exponenten (e)
  • 10 Bits des Bruchs (f), mit einem zusätzlichen ausgeblendeten Bit

Ein float16-Wert (v) folgt den folgenden Regeln:

  • wenn e == 31 und f != 0, dann ist v naN, unabhängig von s
  • wenn e == 31 und f == 0, dann v = (-1)s*unendlich (signiert unendlich)
  • wenn e zwischen 0 und 31 liegt, dann v = (-1)s*2(e-15)*(1.f)
  • wenn e == 0 und f != 0, dann v = (-1)s*2(e-14)*(0.f) (denormalisierte Zahlen)
  • wenn e == 0 und f == 0, dann v = (-1)s*0 (null mit Vorzeichen)

32-Bit-Gleitkommaregeln enthalten auch 16-Bit-Gleitkommazahlen, angepasst an das oben beschriebene Bitlayout. Ausnahmen bilden die folgenden Fälle:

  • Genauigkeit: Unfused-Vorgänge für 16-Bit-Gleitkommazahlen erzeugen ein Ergebnis, das dem nächsten darstellbaren Wert zu einem unendlich genauen Ergebnis entspricht (gerundet auf das nächste gleichmäßige Ergebnis gemäß IEEE-754, angewendet auf 16-Bit-Werte). 32-Bit-Gleitkommaregeln entsprechen der 1 ULP-Toleranz, 16-Bit-Gleitkommaregeln entsprechen 0,5 ULP für nicht bereitgestellte Vorgänge und 0,6 ULP für Fusionsvorgänge.
  • 16-Bit-Gleitkommazahlen behalten Normalwerte bei.

11-Bit- und 10-Bit-Floating-Point-Regeln

Direct3D 10 unterstützt auch 11-Bit- und 10-Bit-Gleitkommaformate.

Format:

  • Kein Vorzeichenbit
  • 5 Bits des voreingenommenen Exponenten (e)
  • 6 Bits des Bruchs (f) für ein 11-Bit-Format, 5 Bits Bruch (f) für ein 10-Bit-Format, wobei in beiden Fällen ein zusätzliches ausgeblendetes Bit vorhanden ist.

Ein float11/float10-Wert (v) folgt den folgenden Regeln:

  • wenn e == 31 und f != 0, dann ist v NaN
  • wenn e == 31 und f == 0, dann v = +unendlich
  • wenn e zwischen 0 und 31 liegt, dann v = 2(e-15)*(1.f)
  • wenn e == 0 und f != 0, dann v = *2(e-14)*(0.f) (denormalisierte Zahlen)
  • wenn e == 0 und f == 0, dann v = 0 (null)

32-Bit-Gleitkommaregeln gelten auch für 11-Bit- und 10-Bit-Gleitkommazahlen, angepasst an das oben beschriebene Bitlayout. Zu den Ausnahmen zählen:

  • Genauigkeit: 32-Bit-Gleitkommaregeln entsprechen 0,5 ULP.
  • 10/11-Bit-Gleitkommazahlen behalten Denormierungen bei.
  • Jeder Vorgang, der zu einer Zahl kleiner als 0 (null) führen würde, wird auf 0 (null) eingespannt.

Ressourcen (Direct3D 10)