Condividi tramite


regole a virgola mobile

Direct3D supporta diverse rappresentazioni a virgola mobile. Tutti i calcoli a virgola mobile si realizzano secondo un sottoinsieme definito delle regole a virgola mobile del formato a precisione singola a 32 bit dello standard IEEE 754.

regole del formato a virgola mobile a 32 bit

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

Abbiamo rispettato le regole IEEE-754

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.

  • Il 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) restituisce -0, mentre rsq(-0) restituisce -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 e versioni successive definiscono lo stesso requisito di IEEE-754: le operazioni a virgola mobile a 32 bit producono un risultato che è compreso entro 0,5 unità dell'ultima posizione (ULP) dal risultato infinitamente preciso. Ciò significa che, ad esempio, l'hardware è autorizzato a troncare i risultati a 32 bit anziché eseguire l'arrotondamento al pari più vicino, in quanto ciò comporterebbe un errore di al massimo 0,5 ULP. Questa regola si applica solo all'aggiunta, alla sottrazione e alla moltiplicazione.

    Le versioni precedenti di Direct3D definiscono un requisito più debole rispetto a IEEE-754: le operazioni a virgola mobile a 32 bit producono un risultato che si trova all'interno di un'unità di ultimo posto (1 ULP) del risultato infinitamente preciso. Ciò significa che, ad esempio, l'hardware è autorizzato a troncare i risultati a 32 bit anziché eseguire round-to-near-even, in quanto ciò genererebbe un errore di al massimo un ULP.

  • 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. Vengono fatte eccezioni per qualsiasi operazione di I/O o di spostamento dati che non manipolano i dati.

  • Gli stati che contengono valori a virgola mobile, come Viewport MinDepth/MaxDepth o BorderColor, possono essere forniti sotto forma di valori denorm e possono essere azzerati o meno prima che l'hardware li utilizzi.

  • Le operazioni di minimo o massimo eliminano i numeri denormalizzati per il confronto, ma il risultato potrebbe essere o non 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.

    La specifica IEEE-754R per le operazioni min e max a virgola mobile indica che se uno degli input di min o max è un valore quiet QNaN, il risultato dell'operazione è l'altro parametro. Per esempio:

    min(x,QNaN) == min(QNaN,x) == x (same for max)
    

    Una revisione della specifica IEEE-754R ha adottato un comportamento diverso per min e max quando un input è un valore SNaN di segnalazione rispetto a un valore QNaN:

    min(x,SNaN) == min(SNaN,x) == QNaN (same for max)
    
    

    In genere, Direct3D segue gli standard per l'aritmetica: IEEE-754 e IEEE-754R. Ma in questo caso, abbiamo una deviazione.

    Le regole aritmetiche in Direct3D 10 e versioni successive non fanno alcuna distinzione tra valori di NaN tranquilli e di segnalazione (QNaN e SNaN). Tutti i valori NaN vengono gestiti nello stesso modo. Nel caso di min e max, il comportamento Direct3D per qualsiasi valore NaN è simile al modo in cui QNaN viene gestito nella definizione IEEE-754R. Per completezza: se entrambi gli input sono NaN, viene restituito qualsiasi valore NaN.

  • Un'altra regola IEEE 754R è che min(-0,+0) == min(+0,-0) == -0 e max(-0,+0) == max(+0,-0) == +0, che rispetta il segno, a differenza delle regole di confronto per lo zero firmato (come illustrato in precedenza). Direct3D consiglia il comportamento IEEE 754R, ma non lo applica; è consentito che il risultato del confronto degli zeri dipenda 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 sono consentiti con una tolleranza di 1 ULP (o, per qualsiasi istruzione che Direct3D descrive con 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.

  • La moltiplicazione e la divisione operano ciascuna a un livello di precisione a virgola mobile a 32 bit (con accuratezza fino a 0,5 ULP per la moltiplicazione e 1,0 ULP per il reciproco della divisione). 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 possono supportare opzionalmente la virgola mobile a doppia precisione. 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 alla generazione di valori denormalizzati è necessario per dati a doppia precisione (nessun comportamento di azzeramento). 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 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 con bias (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 a virgola mobile a 11 e 10 bit

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

Formato:

  • Nessun bit di segno
  • 5 bit di esponente con bias (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 preservano i numeri denormalizzati.
  • Qualsiasi operazione che comporterebbe un numero minore di zero viene bloccata su zero.

Appendici

Risorse

trame