Flyttalsregler (Direct3D 10)

Direct3D 10 stöder flera olika flyttalsrepresentationer. Alla flyttalsberäkningar fungerar under en definierad delmängd av IEEE 754 32-bitars flyttalsbeteende med enkel precision.

32-bitars Floating-Point regler

Det finns två uppsättningar regler: de som följer IEEE-754 och de som avviker från standarden.

IEEE-754-regler har respekterats

Vissa av dessa regler är ett enda alternativ där IEEE-754 erbjuder alternativ.

  • Dividera med 0 ger +/- INF, förutom 0/0 vilket resulterar i NaN.
  • loggen för (+/-) 0 producerar -INF. loggen för ett negativt värde (förutom -0) genererar NaN.
  • Reciprocal kvadratrot (rsq) eller kvadratrot (sqrt) av ett negativt tal genererar NaN. Undantaget är -0; sqrt(-0) producerar -0, och rsq(-0) producerar -INF.
  • INF – INF = NaN
  • (+/-)INF/ (+/-)INF = NaN
  • (+/-)INF * 0 = NaN
  • NaN (valfritt OP) valfritt värde = NaN
  • Jämförelserna EQ, GT, GE, LT och LE, när antingen eller båda operanderna är NaN returnerar FALSE.
  • Jämförelser ignorerar tecknet 0 (så +0 är lika med -0).
  • Jämförelsen NE, när antingen eller båda operanderna är NaN returnerar TRUE.
  • Jämförelser av alla icke-NaN-värden mot +/- INF returnerar rätt resultat.

Avvikelser eller ytterligare krav från IEEE-754-regler

  • IEEE-754 kräver flyttalsåtgärder för att skapa ett resultat som är det närmaste representerbara värdet till ett oändligt exakt resultat, som kallas "runda till närmaste till och med". Direct3D 10 definierar dock ett lösare krav: 32-bitars flyttalsoperationer ger ett resultat som ligger inom en enhet-sista plats (1 ULP) av det oändligt exakta resultatet. Det innebär till exempel att maskinvara tillåts trunkera resultat till 32-bitars i stället för att utföra round-to-nearest-even, eftersom det skulle leda till fel på högst en ULP.
  • Det finns inget stöd för undantag från flyttal, statusbitar eller traps.
  • Denorms töms till sign-preserved noll på indata och utdata för alla matematiska flyttalsåtgärder. Undantag görs för alla I/O- eller dataflyttsåtgärder som inte manipulerar data.
  • Tillstånd som innehåller flyttalsvärden, till exempel Viewport MinDepth/MaxDepth, BorderColor-värden osv., kan anges som denormvärden och kan eller kanske inte rensas före användning av maskinvaran.
  • Minsta eller högsta åtgärder tömer denorms för jämförelse, men resultatet kan eller kanske inte är denorm tömt.
  • NaN-indata till en åtgärd genererar alltid NaN på utdata, men det exakta bitmönstret för NaN krävs inte för att förbli detsamma (såvida inte åtgärden är en rå flyttinstruktion - som inte ändrar data alls.)
  • Min- eller maxåtgärder för vilka endast en operand är NaN returnerar den andra operanden som resultat (i strid med jämförelsereglerna ovan). Det här är en ny IEEE-regel (IEEE 754R), som krävs i Direct3D 10.
  • En annan ny IEEE 754R-regel är att min(-0,+0) == min(+0,-0) == -0 och max(-0,+0) == max(+0,-0) == +0, som respekterar tecknet, till skillnad från jämförelsereglerna för signerad noll (anges ovan). Direct3D 10 rekommenderar IEEE 754R-beteendet här, men det tillämpas inte. Det är tillåtet att resultatet av att jämföra nollor är beroende av parametrarnas ordning, med hjälp av en jämförelse som ignorerar tecknen.
  • x*1.0f resulterar alltid i x (utom denorm tömd).
  • x/1.0f resulterar alltid i x (utom denorm tömd).
  • x +/- 0.0f resulterar alltid i x (utom denorm tömd). Men -0 + 0 = +0.
  • Sammansvetsade åtgärder (till exempel mad, dp3) ger resultat som inte är mindre exakta än den sämsta möjliga serieordningen av utvärdering av den ofuserade expansionen av åtgärden. Observera att definitionen av den sämsta möjliga ordningen för tolerans inte är en fast definition för en viss sammansvetsad åtgärd. det beror på de specifika värdena för indata. De enskilda stegen i den osmälta expansionen tillåts var och en 1 ULP-tolerans (eller för instruktioner som Direct3D 10 anropar med en mer slapp tolerans än 1 ULP, desto mer slapp tolerans tillåts).
  • Sammansvetsade åtgärder följer samma NaN-regler som icke-sammansvetsade åtgärder.
  • Multiplicera och dividera var och en fungerar på 32-bitars flyttalsprecisionsnivå (noggrannhet till 1 ULP).

16-bitars Floating-Point regler

Direct3D 10 stöder också 16-bitars representationer av flyttalsnummer.

Format:

  • 1 teckenbit (s)i MSB-bitens position
  • 5 bitar partisk exponent (e)
  • 10 bitar bråk (f), med ytterligare en dold bit

Ett float16-värde (v) följer följande regler:

  • om e == 31 och f != 0, är v NaN oavsett s
  • if e == 31 and f == 0, then v = (-1)s*infinity (signerad oändlighet)
  • om e är mellan 0 och 31, v = (-1)s*2(e-15)*(1.f)
  • if e == 0 and f != 0, then v = (-1)s*2(e-14)*(0.f) (avnormaliserade tal)
  • if e == 0 and f == 0, then v = (-1)s*0 (signed zero)

32-bitars flyttalsregler gäller även för 16-bitars flyttalsnummer, justerade för den bitlayout som beskrivs ovan. Undantag till detta inkluderar:

  • Precision: Oupplösta åtgärder på 16-bitars flyttalsnummer ger ett resultat som är det närmaste representerande värdet till ett oändligt exakt resultat (avrunda till närmaste jämn, per IEEE-754, tillämpat på 16-bitarsvärden). 32-bitars flyttalsregler följer 1 ULP-tolerans, 16-bitars flyttalregler följer 0,5 ULP för ofuserade åtgärder och 0,6 ULP för sammansvetsade åtgärder.
  • 16-bitars flyttalsnummer bevarar denormer.

11-bitars och 10-bitars Floating-Point regler

Direct3D 10 har också stöd för 11-bitars- och 10-bitars flyttalformat.

Format:

  • Ingen teckenbit
  • 5 bitar partisk exponent (e)
  • 6 bitars bråk (f) för ett 11-bitars format, 5 bitar bråk (f) för ett 10-bitars format, med ytterligare en dold bit i båda fallen.

Ett float11/float10-värde (v) följer följande regler:

  • if e == 31 and f != 0, then v is NaN
  • if e == 31 and f == 0, then v = +infinity
  • om e är mellan 0 och 31, v = 2(e-15)*(1.f)
  • if e == 0 and f != 0, then v = *2(e-14)*(0.f) (denormalized numbers)
  • om e == 0 och f == 0, sedan v = 0 (noll)

32-bitars flyttalsregler gäller även för 11- och 10-bitars flyttalsnummer, justerade för den bitlayout som beskrivs ovan. Undantag är:

  • Precision: 32-bitars flyttalsregler följer 0,5 ULP.
  • 10/11-bitars flyttalsnummer bevarar denorms.
  • Alla åtgärder som skulle resultera i ett tal som är mindre än noll, kläms till noll.

resurser (Direct3D 10)