Reglas de punto flotante (Direct3D 10)

Direct3D 10 admite varias representaciones de punto flotante diferentes. Todos los cálculos de punto flotante funcionan bajo un subconjunto definido del comportamiento de punto flotante de precisión simple ieee 754 de 32 bits.

Reglas de Floating-Point de 32 bits

Hay dos conjuntos de reglas: aquellos que se ajustan a IEEE-754 y los que se desvieron del estándar.

Reglas ieee-754 respetadas

Algunas de estas reglas son una única opción en la que IEEE-754 ofrece opciones.

  • Dividir por 0 produce +/- INF, excepto 0/0, lo que da como resultado NaN.
  • log de (+/-) 0 genera -INF. el registro de un valor negativo (distinto de -0) genera NaN.
  • La raíz cuadrada recíproca (rsq) o la raíz cuadrada (sqrt) de un número negativo produce NaN. La excepción es -0; sqrt(-0) produce -0 y rsq(-0) produce -INF.
  • INF - INF = NaN
  • (+/-) INF / (+/-)INF = NaN
  • (+/-) INF * 0 = NaN
  • NaN (any OP) any-value = NaN
  • Las comparaciones EQ, GT, GE, LT y LE, cuando uno o ambos operandos son NaN devuelve FALSE.
  • Las comparaciones omiten el signo de 0 (por lo que +0 es igual a -0).
  • La comparación NE, cuando o ambos operandos son NaN devuelve TRUE.
  • Las comparaciones de cualquier valor que no sea NaN con +/- INF devuelven el resultado correcto.

Desviaciones o requisitos adicionales de las reglas IEEE-754

  • IEEE-754 requiere operaciones de punto flotante para generar un resultado que sea el valor representable más cercano a un resultado infinitomente preciso, conocido como redondeo a más cercano. Sin embargo, Direct3D 10 define un requisito más flexible: las operaciones de punto flotante de 32 bits producen un resultado que se encuentra dentro de una unidad de último lugar (1 ULP) del resultado infinito preciso. Esto significa que, por ejemplo, el hardware puede truncar los resultados en 32 bits en lugar de realizar el redondeo al más cercano, ya que esto provocaría un error de como máximo una ULP.
  • No hay compatibilidad con excepciones de punto flotante, bits de estado o capturas.
  • Los desnorms se vacían para conservar el signo cero en la entrada y salida de cualquier operación matemática de punto flotante. Las excepciones se realizan para cualquier operación de movimiento de datos o E/S que no manipule los datos.
  • Los estados que contienen valores de punto flotante, como Viewport MinDepth/MaxDepth, valores BorderColor, etc., se pueden proporcionar como valores de desnorm y pueden o no vaciarse antes de su uso por parte del hardware.
  • Las operaciones mínimas o máximas vacían los desnormas para la comparación, pero el resultado puede o no estar desnorm vaciado.
  • La entrada NaN en una operación siempre genera NaN en la salida, pero no es necesario que el patrón de bits exacto de NaN permanezca igual (a menos que la operación sea una instrucción de movimiento sin procesar, que no modifica los datos en absoluto).
  • Operaciones mínimas o máximas para las que solo un operando es NaN devuelve el otro operando como resultado (contrario a las reglas de comparación anteriores). Se trata de una nueva regla IEEE (IEEE 754R), necesaria en Direct3D 10.
  • Otra nueva regla IEEE 754R es que min(-0,+0) == min(+0,-0) == -0 y max(-0,+0) == max(+0,-0) == +0, que respeta el signo, en contraste con las reglas de comparación para cero firmado (indicado anteriormente). Direct3D 10 recomienda aquí el comportamiento IEEE 754R, pero no se aplicará; se permite que el resultado de comparar ceros dependa del orden de los parámetros, utilizando una comparación que omita los signos.
  • x*1.0f siempre da como resultado x (excepto desnorm vaciado).
  • x/1.0f siempre da como resultado x (excepto desnorm vaciado).
  • x +/- 0,0f siempre da como resultado x (excepto desnorm vaciado). Pero -0 + 0 = +0.
  • Las operaciones fusionadas (como mad, dp3) producen resultados que no son menos precisos que el peor orden en serie posible de evaluación de la expansión sin fusión de la operación. Tenga en cuenta que la definición de la peor ordenación posible, para la tolerancia, no es una definición fija para una operación fusionada determinada; depende de los valores concretos de las entradas. Cada uno de los pasos individuales de la expansión no fusionada es 1 tolerancia ULP permitida (o para las instrucciones que direct3D 10 llama con una tolerancia más lax que 1 ULP, se permite la tolerancia más lax).
  • Las operaciones fusionadas cumplen las mismas reglas naN que las operaciones no fusionadas.
  • Multiplique y divida cada uno funciona en el nivel de precisión de punto flotante de 32 bits (precisión a 1 ULP).

Reglas de Floating-Point de 16 bits

Direct3D 10 también admite representaciones de 16 bits de números de punto flotante.

Formato:

  • 1 bit de signo (s) en la posición de bits de MSB
  • 5 bits de exponente sesgado (e)
  • 10 bits de fracción (f), con un bit oculto adicional

Un valor float16 (v) sigue las siguientes reglas:

  • si e == 31 y f != 0, v es NaN independientemente de s.
  • si e == 31 y f == 0, entonces v = (-1)s*infinity (infinito con signo)
  • si e está entre 0 y 31, entonces v = (-1)s*2(e-15)*(1.f)
  • si e == 0 y f != 0, entonces v = (-1)s*2(e-14)*(0.f) (números desnormalizados)
  • si e == 0 y f == 0, entonces v = (-1)s*0 (cero con signo)

Las reglas de punto flotante de 32 bits también contienen números de punto flotante de 16 bits, ajustados para el diseño de bits descrito anteriormente. Las excepciones son:

  • Precisión: las operaciones no fusionadas en números de punto flotante de 16 bits producen un resultado que es el valor representable más cercano a un resultado de precisión infinita (redondeo al más cercano incluso, por IEEE-754, aplicado a valores de 16 bits). Las reglas de punto flotante de 32 bits se adhieren a la tolerancia de 1 ULP, las reglas de punto flotante de 16 bits se adhieren a 0,5 ULP para las operaciones no fusionadas y 0,6 ULP para las operaciones fusionadas.
  • Los números de punto flotante de 16 bits conservan los desnorms.

Reglas de Floating-Point de 11 y 10 bits

Direct3D 10 también admite formatos de punto flotante de 11 y 10 bits.

Formato:

  • Sin bit de signo
  • 5 bits de exponente sesgado (e)
  • 6 bits de fracción (f) para un formato de 11 bits, 5 bits de fracción (f) para un formato de 10 bits, con un bit oculto adicional en cualquier caso.

Un valor float11/float10 (v) sigue las reglas siguientes:

  • si e == 31 y f != 0, v es NaN
  • si e == 31 y f == 0, v = +infinity
  • si e está entre 0 y 31, entonces v = 2(e-15)*(1.f)
  • si e == 0 y f != 0, entonces v = *2(e-14)*(0.f) (números desnormalizados)
  • si e == 0 y f == 0, v = 0 (cero)

Las reglas de punto flotante de 32 bits también contienen números de punto flotante de 11 y 10 bits, ajustados para el diseño de bits descrito anteriormente. Entre las excepciones se incluyen:

  • Precisión: las reglas de punto flotante de 32 bits se adhieren a 0,5 ULP.
  • Los números de punto flotante de 10/11 bits conservan los desnorms.
  • Cualquier operación que daría lugar a un número menor que cero, se sujeta a cero.

Recursos (Direct3D 10)