Compartir a través de


Reglas de punto flotante (Direct3D 11)

Direct3D 11 admite varias representaciones de punto flotante. Todos los cálculos de punto flotante funcionan con un subconjunto definido de las reglas de punto flotante de precisión simple IEEE 754 de 32 bits.

Reglas de punto flotante de 32 bits

Hay dos conjuntos de reglas: las que se ajustan a IEEE-754 y las que se desvían del estándar.

Se han respetado las reglas de IEEE-754

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

  • Dividir por 0 genera +/- INF, excepto 0/0, lo que da como resultado NaN.
  • El logaritmo de (+/-) 0 produce -INF. El logaritmo de un valor negativo (distinto de -0) produce 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) genera -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, devuelven FALSE.
  • Las comparaciones omiten el signo de 0 (por lo que +0 es igual a -0).
  • La comparación NE, cuando uno o ambos operandos es 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 que las operaciones de punto flotante generen un resultado que sea el valor representable más cercano posible a un resultado infinitamente preciso, conocido como redondeo al par más cercano. Direct3D 11 define el mismo requisito: las operaciones de punto flotante de 32 bits producen un resultado que está dentro de 0,5 unidades en último lugar (ULP) del resultado infinitamente preciso. Esto significa que, por ejemplo, el hardware puede truncar los resultados a 32 bits en lugar de realizar un redondeo al par más cercano, ya que esto provocaría un error de como máximo 0,5 ULP. Esta regla solo se aplica a la suma, resta y multiplicación.

  • No hay soporte para excepciones de punto flotante, bits de estado o intercepciones.

  • Los desnormalizaciones 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 o BorderColor, se pueden proporcionar como valores de desnormalización y pueden vaciarse o no antes de que el hardware los use.

  • Las operaciones mínimas o máximas eliminan las desnormalizaciones para la comparación, pero el resultado puede convertirse o no a un valor desnormalizado.

  • La entrada NaN en una operación siempre genera NaN en la salida. Pero el patrón de bits exacto de NaN no es necesario para mantenerse igual (a menos que la operación sea una instrucción de movimiento sin procesar, que no modifica los datos).

  • Las operaciones mínimas o máximas para las que solo un operando es NaN devuelven el otro operando como resultado (contrario a las reglas de comparación que hemos examinado anteriormente). Se trata de una regla IEEE 754R.

    Las reglas aritméticas de Direct3D 10 y versiones posteriores no distinguen entre valores NaN "silenciosos" y "señalización" (QNaN frente a SNaN). Todos los valores "NaN" se controlan de la misma manera.

  • Si ambas entradas a min() o max() son NaN, se devuelve cualquier NaN.

  • Una regla de IEEE 754R es que min(-0,+0) == min(+0,-0) == -0 y max(-0,+0) == max(+0,-0) == +0, lo que respeta el signo. Esto contrasta con las reglas de comparación para cero con signo (indicado anteriormente). Direct3D 11 recomienda el comportamiento IEEE 754R aquí, pero no lo aplica; se permite que el resultado de comparar ceros dependa del orden de los parámetros mediante una comparación que omita los signos.

  • x*1.0f siempre da como resultado x (excepto desnormalización vaciada).

  • x/1.0f siempre da como resultado x (excepto desnormalización vaciada).

  • x +/- 0.0f siempre da como resultado x (excepto desnormalización vaciada). Pero -0 + 0 = +0.

  • Las operaciones fusionadas (como mad, dp3) producen resultados que no son menos precisos que la peor ordenación en serie posible de la evaluación de la expansión no fusionada de la operación. La definición de la peor ordenación posible, para el propósito de la tolerancia, no es una definición fija para una operación fusionada determinada; depende de los valores concretos de las entradas. A cada uno de los pasos de la expansión no fusionada se le permite una tolerancia de 1 ULP (o para cualquier instrucción que Direct3D llame con una tolerancia más flexible que 1 ULP, se permite la tolerancia más flexible).

  • Las operaciones fusionadas cumplen las mismas reglas naN que las operaciones no fusionadas.

  • sqrt y rcp tienen 1 tolerancia ULP. Las instrucciones de raíz cuadrada recíproca y recíproca del sombreador, rcp y rsq, tienen su propio requisito de precisión flexible independiente.

  • Multiplicar y dividir, cada uno, funcionan en el nivel de precisión de punto flotante de 32 bits (precisión a 0,5 ULP para multiplicar, 1,0 ULP para recíproco). Si x/y se implementa directamente, los resultados deben ser de mayor o igual precisión que un método de dos pasos.

Reglas de punto flotante de 64 bits (precisión doble)

Los controladores de hardware y de pantalla pueden admitir el uso de punto flotante de doble precisión. Para indicar compatibilidad, al llamar a ID3D11Device::CheckFeatureSupport con D3D11_FEATURE_DOUBLES, el controlador establece DoublePrecisionFloatShaderOps de D3D11_FEATURE_DATA_DOUBLES en TRUE. A continuación, el controlador y el hardware deben admitir todas las instrucciones de punto flotante de precisión doble.

Las instrucciones de precisión doble siguen los requisitos de comportamiento de IEEE 754R.

Se requiere compatibilidad con la generación de valores desnormalizados para los datos de precisión doble (sin comportamiento de vaciado a cero). Del mismo modo, las instrucciones no leen datos desnormalizados como cero con signo, sino que respetan el valor desnormalizado.

Reglas de punto flotante de 16 bits

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

Formato:

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

Un valor float16 (v) sigue estas reglas:

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

Las reglas de punto flotante de 32 bits también se aplican a los números de punto flotante de 16 bits, ajustadas para el diseño de bits descrito anteriormente. Entre las excepciones a esto se incluyen:

  • 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 infinitamente preciso (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 operaciones no fusionadas y 0,6 ULP para las operaciones fusionadas.
  • Los números de punto flotante de 16 bits conservan las desnormalizaciones.

Reglas de punto flotante de 11 y 10 bits

Direct3D 11 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 = +infinito
  • si e está entre 0 y 31, v = 2(e-15)*(1.f)
  • si e == 0 y f != 0, 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 las desnormalizaciones.
  • Cualquier operación que daría lugar a un número menor que cero se sujeta a cero.

Recursos

Texturas