Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Direct3D 11 supporta diverse rappresentazioni a virgola mobile. Tutti i calcoli a virgola mobile operano in un subset definito delle regole a virgola mobile a precisione singola IEEE 754 a 32 bit.
- regole a virgola mobile a 32 bit
- regole per i numeri a virgola mobile a 64 bit (precisione doppia)
- regole per numeri a virgola mobile a 16 bit
- regole per rappresentazioni a virgola mobile a 11 bit e 10 bit
- argomenti correlati
Regole a virgola mobile a 32 bit
Esistono due set di regole: quelli conformi a IEEE-754 e quelli che deviano 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 restituisce NaN.
- log di (+/-) 0 produce -INF. il log di un valore negativo (diverso da -0) produce NaN.
- La radice quadrata reciproca (rsq) o la radice quadrata (sqrt) di un numero negativo provoca NaN. L'eccezione è -0; sqrt(-0) produce -0 e rsq(-0) produce -INF.
- INF - INF = NaN
- (+/-)INF / (+/-)INF = NaN
- (+/-)INF * 0 = NaN
- NaN (qualsiasi OP) qualsiasi-valore = NaN
- I confronti EQ, GT, GE, LT e LE, quando uno o entrambi gli operandi sono NaN, restituiscono 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 che le operazioni a virgola mobile producano un risultato che sia il valore rappresentabile più vicino a un risultato infinitamente preciso, noto come arrotondamento al numero pari più vicino. Direct3D 11 definisce il medesimo requisito: le operazioni a virgola mobile a 32 bit producono un risultato che è entro 0,5 unità dell'ultimo posto (ULP) rispetto al risultato con precisione infinita. Ciò significa che, ad esempio, l'hardware è autorizzato a troncare i risultati a 32 bit anziché eseguire round-to-near-even, in quanto ciò comporta un errore di al massimo 0,5 ULP. Questa regola si applica solo all'aggiunta, alla sottrazione e alla moltiplicazione.
Non è disponibile alcun supporto per eccezioni a virgola mobile, bit di stato o trap.
I numeri denormalizzati vengono convertiti in zero mantenendo il segno nell'input e nell'output di qualsiasi operazione matematica a virgola mobile. Le eccezioni vengono eseguite per qualsiasi operazione di I/O o di spostamento dati che non modifica i dati.
Gli stati che contengono valori a virgola mobile, come Viewport MinDepth/MaxDepth e i valori BorderColor, possono essere forniti come valori denormalizzati e possono essere azzerati o possono non essere azzerati prima che l'hardware li utilizzi.
Min o max operazioni svuotano i denorm per il confronto, ma il risultato potrebbe o non potrebbe essere denormalizzato.
L'input NaN per un'operazione produce sempre NaN nell'output. Ma il modello di bit esatto del NaN non è necessario per rimanere invariato (a meno che l'operazione non sia un'istruzione di spostamento non elaborata, che non modifica i dati).
Le operazioni min o max per cui un solo operando è NaN restituiscono l'altro operando come risultato (contrariamente alle regole di confronto esaminate in precedenza). Si tratta di una regola IEEE 754R.
Le regole aritmetiche in Direct3D 10 e versioni successive non fanno alcuna distinzione tra i valori NaN "quiet" e "signaling" (QNaN e SNaN). Tutti i valori "NaN" vengono gestiti nello stesso modo.
Se entrambi gli input per min() o max() sono NaN, viene restituito qualsiasi valore NaN.
Una regola IEEE 754R è che min(-0,+0) == min(+0,-0) == -0 e max(-0,+0) == max(+0,-0) == +0; che rispettano il segno. Questo è in contrasto con le regole di confronto per lo zero firmato (indicato in precedenza). Direct3D 11 consiglia il comportamento IEEE 754R, ma non lo applica; è consentito che il risultato del confronto degli zeri sia dipendente dall'ordine dei parametri, usando 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) generano risultati che non sono meno precisi rispetto al peggior ordine seriale possibile di valutazione dell'espansione dell'operazione non fusa. La definizione del peggiore possibile ordinamento, allo scopo della tolleranza, non è una definizione fissa per una determinata operazione fusibile; dipende dai valori specifici degli input. I singoli passaggi dell'espansione nonfusa hanno ciascuno una tolleranza di 1 ULP (o per qualsiasi istruzione per cui Direct3D chiama una tolleranza più rilassata rispetto a 1 ULP, è consentita la tolleranza più rilassata).
Le operazioni fuse rispettano le stesse regole NaN delle operazioni non fuse.
sqrt e rcp hanno una tolleranza di 1 ULP. Le istruzioni dello shader 'reciproco' e 'reciproco della radice quadrata', rcp e rsq, hanno un proprio requisito di precisione rilassata separato.
Moltiplica e dividi, ciascuno opera con il livello di precisione a virgola mobile a 32 bit (accuratezza di 0,5 ULP per la moltiplicazione, 1,0 ULP per la reciprocità). Se x/y viene implementato direttamente, i risultati devono avere una precisione maggiore o uguale a quella di un metodo in due passaggi.
Regole a virgola mobile a 64 bit (precisione doppia)
I driver hardware e di visualizzazione supportano facoltativamente virgola mobile a precisione doppia. Per indicare il supporto, quando si chiama ID3D11Device::CheckFeatureSupport con D3D11_FEATURE_DOUBLES, il driver imposta DoublePrecisionFloatShaderOps di D3D11_FEATURE_DATA_DOUBLES su TRUE. Il driver e l'hardware devono quindi supportare tutte le istruzioni a virgola mobile in doppia precisione.
Le istruzioni per la precisione doppia seguono i requisiti di comportamento IEEE 754R.
Il supporto per la generazione di valori denormalizzati è necessario per i dati a precisione doppia (nessun comportamento da scaricamento a zero). Analogamente, le istruzioni non interpretano i dati denormalizzati come uno zero con segno, ma rispettano il valore denormalizzato.
Regole a virgola mobile a 16 bit
Direct3D 11 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 biasato (e)
- 10 bit di frazione (f), con un bit nascosto aggiuntivo
Un valore float16 (v) segue queste regole:
- se e == 31 e f != 0, v è NaN indipendentemente da s
- se e == 31 e f == 0, quindi 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, v = (-1)s*2(e-14)*(0,f) (numeri denormalizzati)
- se e == 0 e f == 0, v = (-1)s*0 (con segno zero)
Le regole per i numeri a virgola mobile a 32 bit valgono anche per i numeri a virgola mobile a 16 bit, con gli opportuni aggiustamenti per il layout dei bit descritto in precedenza. Le eccezioni a questo includono:
- Precisione: le operazioni non fuse 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 pari, 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 numeri denormalizzati.
Regole per i numeri in virgola mobile a 11 bit e a 10 bit
Direct3D 11 supporta anche formati a virgola mobile a 11 bit e a 10 bit.
Formato:
- Nessun bit di segno
- 5 bit di esponente biasato (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, quindi 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 si applicano anche ai numeri a virgola mobile a 11 bit e a 10 bit, regolati per il layout di bit descritto in precedenza. Le eccezioni includono:
- Precisione: le regole a virgola mobile a 32 bit rispettano 0,5 ULP.
- I numeri a virgola mobile a 10/11 bit mantengono i numeri denormalizzati.
- Qualsiasi operazione che comporterebbe un numero minore di zero viene bloccata su zero.
Argomenti correlati