Regole a virgola mobile (Direct3D 10)

Direct3D 10 supporta diverse rappresentazioni a virgola mobile. Tutti i calcoli a virgola mobile operano in un subset definito del comportamento a virgola mobile a precisione singola IEEE 754 a 32 bit.

Regole di Floating-Point a 32 bit

Esistono due set di regole: quelli conformi a IEEE-754 e quelli che si discostono dallo standard.

Regole IEEE-754 rispettate

Alcune di queste regole sono un'unica opzione in cui IEEE-754 offre opzioni.

  • La divisione per 0 produce +/- INF, ad eccezione di 0/0 che produce NaN.
  • log di (+/-) 0 produce -INF. log di un valore negativo (diverso da -0) produce NaN.
  • Radice quadrata reciproca (rsq) o radice quadrata (sqrt) di un numero negativo produce NaN. L'eccezione è -0; sqrt(-0) produce -0 e rsq(-0) produce -INF.
  • INF - INF = NaN
  • (+/-) INF / (+/-)INF = NaN
  • (+/-) INF * 0 = NaN
  • NaN (any OP) any-value = NaN
  • I confronti EQ, GT, GE, LT e LE, quando uno o entrambi gli operandi sono NaN restituisce FALSE.
  • I confronti ignorano il segno di 0 (quindi +0 è uguale a -0).
  • Il confronto NE, quando uno o entrambi gli operandi è NaN restituisce TRUE.
  • I confronti di qualsiasi valore non NaN rispetto a +/- INF restituiscono il risultato corretto.

Deviazioni o requisiti aggiuntivi dalle regole IEEE-754

  • IEEE-754 richiede operazioni a virgola mobile per produrre un risultato che è il valore rappresentabile più vicino a un risultato infinitamente preciso, noto come round-to-near-even. Direct3D 10, tuttavia, definisce un requisito più debole: le operazioni a virgola mobile a 32 bit producono un risultato che si trova all'interno di un'unità di ultima posizione (1 ULP) del risultato infinitamente preciso. Ciò significa che, ad esempio, l'hardware è autorizzato a troncare i risultati a 32 bit anziché eseguire il round-to-near-even, in quanto ciò provocherebbe un errore di al massimo un ULP.
  • Non è disponibile alcun supporto per eccezioni a virgola mobile, bit di stato o trap.
  • I denorm vengono scaricati per firmare zero mantenuto nell'input e nell'output di qualsiasi operazione matematica a virgola mobile. Le eccezioni vengono effettuate per qualsiasi operazione di I/O o di spostamento dati che non modifica i dati.
  • Gli stati che contengono valori a virgola mobile, ad esempio Viewport MinDepth/MaxDepth, i valori BorderColor e così via, possono essere forniti come valori denorm e possono o non essere scaricati prima dell'uso dall'hardware.
  • Min o max operations flush denorms for comparison, but the result may or not be denorm flushed.Min or max operations flush denorm for comparison, but the result may or not be denorm flushed.
  • L'input NaN a un'operazione produce sempre NaN sull'output, ma non è necessario che il modello di bit esatto del NaN rimanga invariato (a meno che l'operazione non sia un'istruzione di spostamento non elaborata, che non modifica affatto i dati).
  • Le operazioni min o max per cui un solo operando è NaN restituiscono l'altro operando come risultato (contrariamente alle regole di confronto precedenti). Si tratta di una nuova regola IEEE (IEEE 754R), richiesta in Direct3D 10.
  • Un'altra nuova regola IEEE 754R è che min(-0,+0) == min(+0,-0) == -0 e max(-0,+0) == max(+0,-0) == +0, che rispettano il segno, a differenza delle regole di confronto per lo zero firmato (indicato sopra). Direct3D 10 consiglia il comportamento IEEE 754R, ma non verrà applicato; è consentito che il risultato del confronto degli zeri sia dipendente dall'ordine dei parametri, utilizzando un confronto che ignora i segni.
  • x*1.0f restituisce sempre x (tranne denorm scaricato).
  • x/1.0f restituisce sempre x (tranne denorm scaricato).
  • x +/- 0.0f restituisce sempre x (tranne denorm scaricato). Ma -0 + 0 = +0.
  • Le operazioni fuse (ad esempio mad, dp3) producono risultati che non sono meno accurati rispetto al peggiore possibile ordinamento seriale della valutazione dell'espansione nonfusa dell'operazione. Si noti che la definizione dell'ordinamento peggiore possibile, allo scopo della tolleranza, non è una definizione fissa per una determinata operazione fuso; dipende dai valori specifici degli input. I singoli passaggi dell'espansione nonfusa sono consentiti ogni 1 tolleranza ULP (o per qualsiasi istruzione che Direct3D 10 chiama con una tolleranza più lax rispetto a 1 ULP, maggiore è la tolleranza lax).
  • Le operazioni fuse rispettano le stesse regole NaN delle operazioni non fuse.
  • Moltiplicare e dividere ogni operazione opera a livello di precisione a virgola mobile a 32 bit (accuratezza a 1 ULP).

Regole di Floating-Point a 16 bit

Direct3D 10 supporta anche rappresentazioni a 16 bit di numeri a virgola mobile.

Formato:

  • 1 bit di segno (s)nella posizione del bit MSB
  • 5 bit di esponente distorto (e)
  • 10 bit di frazione (f), con un bit nascosto aggiuntivo

Un valore float16 (v) segue le regole seguenti:

  • se e == 31 e f != 0, v è NaN indipendentemente da s
  • se e == 31 e f == 0, allora v = (-1)s*infinity (infinito con segno)
  • se e è compreso tra 0 e 31, v = (-1)s*2(e-15)*(1.f)
  • se e == 0 e f != 0, allora v = (-1)s*2(e-14)*(0.f) (numeri denormalizzati)
  • se e == 0 e f == 0, quindi v = (-1)s*0 (con segno zero)

Le regole a virgola mobile a 32 bit contengono anche numeri a virgola mobile a 16 bit, regolati per il layout di bit descritto in precedenza. Alcune eccezioni:

  • Precisione: le operazioni senzafuse sui numeri a virgola mobile a 16 bit producono un risultato che è il valore rappresentabile più vicino a un risultato infinitamente preciso (arrotondato al più vicino, per IEEE-754, applicato ai valori a 16 bit). Le regole a virgola mobile a 32 bit rispettano 1 tolleranza ULP, le regole a virgola mobile a 16 bit rispettano 0,5 ULP per le operazioni nonfuse e 0,6 ULP per le operazioni fuse.
  • I numeri a virgola mobile a 16 bit mantengono i denorm.

Regole di Floating-Point a 11 bit e a 10 bit

Direct3D 10 supporta anche formati a virgola mobile a 11 bit e a 10 bit.

Formato:

  • Nessun bit di segno
  • 5 bit di esponente distorto (e)
  • 6 bit di frazione (f) per un formato a 11 bit, 5 bit di frazione (f) per un formato a 10 bit, con un bit nascosto aggiuntivo in entrambi i casi.

Un valore float11/float10 (v) segue le regole seguenti:

  • se e == 31 e f != 0, v è NaN
  • se e == 31 e f == 0, quindi v = +infinito
  • se e è compreso tra 0 e 31, v = 2(e-15)*(1.f)
  • se e == 0 e f != 0, allora v = *2(e-14)*(0.f) (numeri denormalizzati)
  • se e == 0 e f == 0, quindi v = 0 (zero)

Le regole a virgola mobile a 32 bit contengono anche numeri a virgola mobile a 11 bit e a 10 bit, regolati per il layout di bit descritto in precedenza. Le eccezioni sono le seguenti:

  • Precisione: le regole a virgola mobile a 32 bit rispettano l'ULP 0,5.
  • I numeri a virgola mobile a 10/11 bit mantengono i denorm.
  • Qualsiasi operazione che genera un numero minore di zero viene bloccata su zero.

Risorse (Direct3D 10)