Freigeben über


Gleitkommaregeln

Direct3D unterstützt mehrere Gleitkommadarstellungen. Alle Gleitkommaberechnungen erfolgen gemäß einer definierten Teilmenge der IEEE 754 32-Bit-Gleitkommaregeln mit einfacher Genauigkeit.

32-Bit-Gleitkommaregeln

Es gibt zwei Regelsätze: diejenigen, die IEEE-754 entsprechen, und diejenigen, die vom Standard abweichen.

Ehrwürdige IEEE-754-Regeln

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

  • Durch 0 dividieren ergibt +/- INF, außer bei 0/0, was NaN ergibt.

  • Der Logarithmus von (+/-) 0 ergibt -INF.  

    Der Logarithmus eines negativen Werts (außer -0) führt zu NaN.

  • Die reziproke Quadratwurzel (rsq) oder die Quadratwurzel (sqrt) einer negativen Zahl ergibt NaN.  

    Die Ausnahme ist -0; sqrt(-0) erzeugt -0 und rsq(-0) erzeugt -INF.

  • INF - INF = NaN

  • (+/-)INF / (+/-)INF = NaN

  • (+/-)INF * 0 = NaN

  • NaN (beliebige OP) beliebiger Wert = NaN

  • Die Vergleiche EQ, GT, GE, LT und LE geben FALSE zurück, wenn entweder ein Operand oder beide Operanden NaN sind.

  • Vergleiche ignorieren das Vorzeichen 0 (sodass +0 gleich -0ist).

  • Der Vergleich NE gibt TRUEzurück, wenn entweder ein oder beide Operanden NaN sind.

  • Vergleiche eines Nicht-NaN-Werts mit +/- INF geben das richtige Ergebnis zurück.

Abweichungen oder zusätzliche Anforderungen zu den IEEE-754-Regeln

  • IEEE-754 erfordert, dass Gleitkommaberechnungen ein Ergebnis liefern, das den am nächsten darstellbaren Wert zu einem unendlich präzisen Ergebnis darstellt, das als Rundung zur nächstgelegenen geraden Zahl bezeichnet wird.

    Direct3D 11 und höher definieren die gleiche Anforderung wie IEEE-754: 32-Bit-Gleitkomma-Berechnungen erzeugen ein Ergebnis, das sich innerhalb von 0,5 Einheiten in der letzten Stelle (ULP) des unendlich genauen Ergebnisses befindet. Dies bedeutet, dass z. B. Hardware Ergebnisse auf 32-Bit abschneiden darf, anstatt round-to-nearest-even durchzuführen, da dies zu einem Fehler von höchstens 0,5 ULP führen würde. Diese Regel gilt nur für Addition, Subtraktion und Multiplikation.

    Frühere Versionen von Direct3D definieren eine lockerere Anforderung als IEEE-754: 32-Bit-Gleitkommavorgänge erzeugen ein Ergebnis, das sich innerhalb einer letzten Stelle (1 ULP) des unendlich präzisen Ergebnisses befindet. Dies bedeutet, dass z. B. Hardware Ergebnisse auf 32-Bit abschneiden darf, anstatt auf die nächste gerade Zahl zu runden, da dies zu einem Fehler von höchstens einem ULP führen würde.

  • Es gibt keine Unterstützung für Gleitkomma-Ausnahmen, Statusbits oder Traps.

  • Denormierte Zahlen werden bei der Eingabe und Ausgabe eines mathematischen Gleitkommavorgangs auf eine Vorzeichen-erhaltende Null gesetzt. Ausnahmen werden für alle E/A- oder Datenverschiebungsvorgänge vorgenommen, die die Daten nicht bearbeiten.

  • Zustände, die Gleitkommawerte enthalten, wie z. B. Viewport MinDepth/MaxDepth- oder BorderColor-Werte, können als denormalisierte Werte bereitgestellt werden und werden möglicherweise nicht bereinigt, bevor die Hardware sie verwendet.

  • ** Min- oder Max-Vorgänge flushen Denormalzahlen für den Vergleich, aber das Ergebnis könnte entnormt werden oder auch nicht.

  • Eine NaN-Eingabe bei einer Operation führt immer zu NaN im Ergebnis. Das genaue Bitmuster des NaN muss jedoch nicht gleich bleiben, es sei denn, der Vorgang ist eine Rohverschiebeanweisung, die keine Daten verändert.

  • Min- oder Max-Vorgänge, für die nur ein Operand naN ist, geben den anderen Operanden als Ergebnis zurück (im Gegensatz zu Vergleichsregeln, die wir zuvor betrachtet haben). Dies ist eine IEEE 754R-Regel.

    Die IEEE-754R-Spezifikation für Gleitkomma-Minimal- und Maximaloperationen gibt an, dass wenn einer der Eingabewerte in min oder max ein quiet QNaN-Wert ist, das Ergebnis der Operation der andere Parameter ist. Beispiel:

    min(x,QNaN) == min(QNaN,x) == x (same for max)
    

    Eine Überarbeitung der IEEE-754R-Spezifikation hat ein anderes Verhalten für min und max übernommen, wenn eine Eingabe ein "signalierender" SNaN-Wert im Vergleich zu einem QNaN-Wert ist:

    min(x,SNaN) == min(SNaN,x) == QNaN (same for max)
    
    

    Im Allgemeinen folgt Direct3D den Standards für Arithmetik: IEEE-754 und IEEE-754R. Aber in diesem Fall haben wir eine Abweichung.

    Die arithmetischen Regeln in Direct3D 10 und höher machen keine Unterscheidungen zwischen stillen und signalierenden NaN-Werten (QNaN und SNaN). Alle NaN-Werte werden auf die gleiche Weise behandelt. Im Fall von Min und Max entspricht das Direct3D-Verhalten für jeden NaN-Wert der Behandlung von QNaN in der IEEE-754R-Definition. Zur Vollständigkeit: Wenn beide Eingaben NaN sind, wird irgendein NaN-Wert zurückgegeben.

  • Eine weitere IEEE 754R-Regel ist, dass min(-0,+0) == min(+0,-0) == -0 und max(-0,+0) == max(+0,-0) == +0, das das Zeichen berücksichtigt, im Gegensatz zu den Vergleichsregeln für signierte Null (wie zuvor gesehen). Direct3D empfiehlt hier das IEEE 754R-Verhalten, erzwingt es jedoch nicht; 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 ergibt immer x (mit Ausnahme von denorm geleert).

  • x/1.0f ergibt immer x (außer denorm flushed).

  • x +/- 0,0f ergibt immer x (außer bei zurückgesetzten denormalisierten Werten). Aber -0 + 0 = +0.

  • Fused-Operationen (z. B. mad, dp3) erzeugen Ergebnisse, die nicht weniger genau sind als die schlechteste mögliche serielle Reihenfolge der Bewertung der nicht-verschmolzenen Ausweitung des Vorgangs. Die Definition der schlechtesten möglichen Reihenfolge zum Zweck der Toleranz ist keine feste Definition für einen bestimmten fusionierten Vorgang; sie hängt von den jeweiligen Eingangswerten ab. Die einzelnen Schritte in der unfused-Erweiterung dürfen jeweils eine Toleranz von 1 ULP aufweisen (oder bei Anweisungen, bei denen Direct3D eine lockerere Toleranz als 1 ULP festlegt, ist diese lockerere Toleranz zulässig).

  • Fusionsvorgänge entsprechen den gleichen NaN-Regeln wie nicht fusionierte Vorgänge.

  • sqrt und rcp haben 1 ULP-Toleranz. Die Reziproke- und reziproken Quadratwurzel-Anweisungen, rcp und rsq, haben ihre eigenen, separaten Anforderungen an die entspannte Genauigkeit.

  • Multiplikation und Division arbeiten jeweils mit 32-Bit-Gleitkommagenauigkeit (Genauigkeit auf 0,5 ULP für Multiplikation, 1,0 ULP für Kehrwert). Wenn x/y direkt implementiert wird, müssen die Ergebnisse genauer oder gleich genau sein wie bei einer zweistufigen Methode.

64-Bit-Gleitkommaregeln (doppelte Genauigkeit)

Hardware- und Anzeigetreiber unterstützen optional Gleitkomma mit doppelter Genauigkeit. Zum Angeben der Unterstützung beim Aufruf von ID3D11Device::CheckFeatureSupport mit D3D11_FEATURE_DOUBLES legt der Treiber DoublePrecisionFloatShaderOps von D3D11_FEATURE_DATA_DOUBLES auf TRUE fest. Dann müssen der Treiber und die Hardware alle Gleitkommaoperationen mit doppelter Genauigkeit unterstützen.

Anweisungen mit doppelter Genauigkeit folgen den IEEE 754R-Verhaltensanforderungen.

Unterstützung für die Erzeugung von denormalisierten Werten ist für Daten mit doppelter Genauigkeit erforderlich (kein Verhalten zum Zurücksetzen auf Null). Ebenso lesen Befehle denormalisierte Daten nicht als signierte Null, sondern berücksichtigen den denormalisierten Wert.

16-Bit-Gleitkommaregeln

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

Format:

  • 1 Vorzeichenbit (s) in der MSB-Bitposition
  • 5 Bits für verschobenen Exponenten (e)
  • 10 Bruchbits (f) mit einem zusätzlichen versteckten 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*infinity (Unendlichkeit mit Vorzeichen)
  • 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 (signiert null)

32-Bit-Gleitkommaregeln gelten auch für 16-Bit-Gleitkommazahlen, die an das zuvor beschriebene Bitlayout angepasst wurden. Zu diesen Ausnahmen gehören:

  • Genauigkeit: Unfused-Operationen für 16-Bit-Gleitkommazahlen erzeugen ein Ergebnis, das den nächsten darstellbaren Wert zu einem Ergebnis mit unendlicher Genauigkeit darstellt (gemäß IEEE-754 auf die nächste gerade Zahl gerundet, angewendet auf 16-Bit-Werte). 32-Bit-Gleitkommaregeln entsprechen einer ULP-Toleranz von 1, 16-Bit-Gleitkommaregeln entsprechen 0,5 ULP für nicht-fusionierte Vorgänge und 0,6 ULP für fusionierte Vorgänge.
  • 16-Bit-Gleitkommazahlen behalten denormalisierte Werte bei.

11-Bit- und 10-Bit-Gleitkommaregeln

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

Format:

  • Kein Zeichenbit
  • 5 Bits für verschobenen Exponenten (e)
  • 6 Bruchbits (f) für ein 11-Bit-Format, 5 Bruchbits (f) für ein 10-Bit-Format mit einem zusätzlichen versteckten Bit in beiden Fällen.

Ein Wert des Typs float11/float10 (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, die an das zuvor beschriebene Bitlayout angepasst sind. Zu den Ausnahmen gehören:

  • Genauigkeit: 32-Bit-Gleitkommaregeln entsprechen 0,5 ULP.
  • 10/11-Bit-Gleitkommazahlen behalten denormalisierte Werte bei.
  • Jeder Vorgang, der zu einer Zahl kleiner als 0 führen würde, wird auf Null geklemmt.

Anhänge

Ressourcen

Texturen