Regras de ponto flutuante (Direct3D 10)
O Direct3D 10 dá suporte a várias representações de ponto flutuante diferentes. Todos os cálculos de ponto flutuante operam sob um subconjunto definido do comportamento de ponto flutuante de precisão única do IEEE 754 de 32 bits.
- regras de Floating-Point de 32 bits
- Regras do IEEE-754 respeitadas
- desvios ou requisitos adicionais de regras do IEEE-754
- regras de Floating-Point de 16 bits
- regras de Floating-Point de 11 bits e 10 bits
- tópicos relacionados
Regras de Floating-Point de 32 bits
Há dois conjuntos de regras: aqueles que estão em conformidade com o IEEE-754 e aqueles que se desviam do padrão.
Regras do IEEE-754 respeitadas
Algumas dessas regras são uma única opção em que o IEEE-754 oferece opções.
- Dividir por 0 produz +/- INF, exceto 0/0 que resulta em NaN.
- o log de (+/-) 0 produz -INF. o log de um valor negativo (diferente de -0) produz NaN.
- Raiz quadrada recíproca (rsq) ou raiz quadrada (sqrt) de um número negativo produz NaN. A exceção é -0; sqrt(-0) produz -0 e rsq(-0) produz -INF.
- INF – INF = NaN
- (+/-)INF / (+/-)INF = NaN
- (+/-)INF * 0 = NaN
- NaN (qualquer OP) any-value = NaN
- As comparações EQ, GT, GE, LT e LE, quando um ou ambos os operandos são NaN retorna FALSE.
- As comparações ignoram o sinal de 0 (portanto, +0 é igual a -0).
- O NE de comparação, quando um ou ambos os operandos é NaN retorna VERDADEIRO.
- Comparações de qualquer valor não NaN em relação a +/- INF retornam o resultado correto.
Desvios ou requisitos adicionais de regras IEEE-754
- O IEEE-754 requer operações de ponto flutuante para produzir um resultado que seja o valor representável mais próximo de um resultado infinitamente preciso, conhecido como arredondar para o par mais próximo. O Direct3D 10, no entanto, define um requisito mais flexível: operações de ponto flutuante de 32 bits produzem um resultado que está dentro de uma ulp (1 ulp) de unidade de último lugar do resultado infinitamente preciso. Isso significa que, por exemplo, o hardware tem permissão para truncar resultados para 32 bits em vez de executar de volta para mais próximo, pois isso resultaria em erro de no máximo um ULP.
- Não há suporte para exceções de ponto flutuante, bits de status ou armadilhas.
- Os denorms são liberados para zero preservado por sinal na entrada e saída de qualquer operação matemática de ponto flutuante. Exceções são feitas para qualquer operação de movimentação de dados ou de E/S que não manipule os dados.
- Estados que contêm valores de ponto flutuante, como Viewport MinDepth/MaxDepth, valores BorderColor etc., podem ser fornecidos como valores de desnorm e podem ou não ser liberados antes do uso pelo hardware.
- Operações mínimas ou máximas liberam denorms para comparação, mas o resultado pode ou não ser liberado.
- A entrada naN para uma operação sempre produz NaN na saída, no entanto, o padrão de bit exato do NaN não é necessário para permanecer o mesmo (a menos que a operação seja uma instrução de movimentação bruta - que não altere os dados.)
- Operações mínimas ou máximas para as quais apenas um operando é NaN retornam o outro operando como resultado (ao contrário das regras de comparação acima). Essa é uma nova regra IEEE (IEEE 754R), necessária no Direct3D 10.
- Outra nova regra IEEE 754R é que min(-0,+0) == min(+0,-0) == -0 e max(-0,+0) == max(+0,-0) == +0, que respeitam o sinal, em contraste com as regras de comparação para zero assinado (declarado acima). O Direct3D 10 recomenda o comportamento do IEEE 754R aqui, mas ele não será imposto; é permitido que o resultado da comparação de zeros dependa da ordem dos parâmetros, usando uma comparação que ignora os sinais.
- x*1.0f sempre resulta em x (exceto denorm liberado).
- x/1.0f sempre resulta em x (exceto denorm liberado).
- x +/- 0,0f sempre resulta em x (exceto denorm liberado). Mas -0 + 0 = +0.
- Operações fundidas (como mad, dp3) produzem resultados que não são menos precisos do que a pior ordenação serial possível de avaliação da expansão infundida da operação. Observe que a definição da pior ordenação possível, para fins de tolerância, não é uma definição fixa para uma determinada operação fundida; depende dos valores específicos das entradas. As etapas individuais na expansão não infundida são permitidas 1 tolerância ULP (ou para qualquer instrução que o Direct3D 10 chama com uma tolerância mais frouxa do que 1 ULP, a tolerância mais frouxa é permitida).
- Operações fundidas seguem as mesmas regras de NaN que operações não fundidas.
- Multiplicar e dividir cada um opera no nível de precisão de ponto flutuante de 32 bits (precisão para 1 ULP).
Regras de Floating-Point de 16 bits
O Direct3D 10 também dá suporte a representações de 16 bits de números de ponto flutuante.
Formato:
- 1 bit de sinal (s) na posição de bit do MSB
- 5 bits de expoente tendencioso (e)
- 10 bits de fração (f), com um bit oculto adicional
Um valor float16 (v) segue as seguintes regras:
- se e == 31 e f != 0, v é NaN independentemente de s
- if e == 31 and f == 0, then v = (-1)s*infinity (signed infinity)
- se e estiver entre 0 e 31, v = (-1)s*2(e-15)*(1.f)
- se e == 0 e f != 0, v = (-1)s*2(e-14)*(0.f) (números desnormalizados)
- se e == 0 e f == 0, v = (-1)s*0 (assinado zero)
As regras de ponto flutuante de 32 bits também são mantidas para números de ponto flutuante de 16 bits, ajustados para o layout de bit descrito acima. As exceções a isso incluem:
- Precisão: as operações não infundidas em números de ponto flutuante de 16 bits produzem um resultado que é o valor representável mais próximo a um resultado infinitamente preciso (arredondar para o par mais próximo, por IEEE-754, aplicado a valores de 16 bits). As regras de ponto flutuante de 32 bits seguem uma tolerância ULP, regras de ponto flutuante de 16 bits seguem 0,5 ULP para operações não infundidas e 0,6 ULP para operações fundidas.
- Números de ponto flutuante de 16 bits preservam denorms.
Regras de Floating-Point de 11 bits e 10 bits
O Direct3D 10 também dá suporte a formatos de ponto flutuante de 11 bits e 10 bits.
Formato:
- Nenhum bit de sinal
- 5 bits de expoente tendencioso (e)
- 6 bits de fração (f) para um formato de 11 bits, 5 bits de fração (f) para um formato de 10 bits, com um bit oculto adicional em ambos os casos.
Um valor float11/float10 (v) segue as seguintes regras:
- se e == 31 e f != 0, v é NaN
- se e == 31 e f == 0, v = +infinito
- se e estiver entre 0 e 31, v = 2(e-15)*(1.f)
- se e == 0 e f != 0, v = *2(e-14)*(0.f) (números desnormalizados)
- se e == 0 e f == 0, v = 0 (zero)
As regras de ponto flutuante de 32 bits também são mantidas para números de ponto flutuante de 11 bits e 10 bits, ajustados para o layout de bit descrito acima. As exceções incluem:
- Precisão: as regras de ponto flutuante de 32 bits seguem a ULP 0,5.
- Números de ponto flutuante de 11 bits de 10/11 bits preservam denorms.
- Qualquer operação que resulte em um número menor que zero é fixada a zero.
Tópicos relacionados
-
recursos do (Direct3D 10)