Megosztás a következőn keresztül:


IEEE Floating-Point ábrázolása

A Microsoft C++ (MSVC) megfelel az IEEE numerikus szabványainak. Az IEEE-754 szabvány a lebegőpontos formátumokat írja le, így valós számokat jelölhet a hardverben. A lebegőpontos számoknak legalább öt belső formátuma van, amelyek az MSVC-fordító által megcélzott hardverben ábrázolhatók. A fordító csak kettőt használ. Az MSVC az egypontos (4 bájtos) és a dupla pontosságú (8 bájtos) formátumokat használja. Az egypontos pontosság a kulcsszóval floatdeklarálva van. A dupla pontosság a kulcsszó doublehasználatával deklarálva van. Az IEEE szabvány emellett a félpontosságú (2 bájtos) és a négybájtos (16 bájtos) formátumot, valamint a dupla pontosságú (10 bájtos) formátumot is meghatározza, amelyet egyes C és C++ fordítók adattípusként long double implementálnak. Az MSVC fordítóban az long double adattípus különálló típusként van kezelve, de a tárolási típus a következőre van leképezve double. A más formátumokat használó számítások esetében azonban belső és szerelvénynyelvi támogatás áll rendelkezésre, beleértve a dupla pontosságú formátumot is, ahol a hardverek támogatják.

Az értékek tárolása az alábbiak szerint történik:

Érték Tárolás másként
egypontos pontosság jelbit, 8 bites kitevő, 23 bites mantissza
dupla pontosság jelbit, 11 bites kitevő, 52 bites mantissza

Az egyszeres és kétszeres pontosságú formátumok esetében a törtrészben van egy feltételezett 1-es az elején. A törtrész neve szignifikand (más néven mantissza). Ez a kezdő 1 nem a memóriában van tárolva, így a jelzők valójában 24 vagy 53 bitesek, még akkor is, ha egy kisebb bit lesz tárolva. A double-extended-precision formátum valójában ezt a bitet tárolja.

A kitevők a lehetséges értéktartományuk felével el vannak tolva. Ez azt jelenti, hogy kivonja ezt a torzítást a tárolt kitevőből, hogy megkapja a valódi kitevőt. Ha a tárolt kitevő kisebb, mint az elfogultság, az valójában negatív kitevő.

A kitevők az alábbiak szerint elfogultak:

Kitevő Elfogult
8 bites (egyszeres pontosságú) 127
11 bites (dupla pontosságú) 1023

Ezek a kitevők nem tízes hatványok; kettes hatványai. Ez azt jelenti, hogy a 8 bites tárolt kitevők -127 és 127 közötti értékeket vehetnek fel, amelyeket 0-tól 254-ig tárolnak. A 2127 érték nagyjából 1038-nak felel meg, ami az egypontos pontosság tényleges korlátja.

A szignifikandus bináris tört formájában van tárolva, 1.XXX... . Ennek a törtnek az értéke 1-nél nagyobb vagy egyenlő, és kisebb, mint 2. A valós számok tárolása mindig normalizált formában történik. Ez azt jelzi, hogy a significand úgy van balra tolva, hogy a significand nagyságrendi bitje mindig 1 legyen. Mivel ez a bit mindig 1, feltételezzük (nem tároljuk) az egy pontosságú és a dupla pontosságú formátumokban. A bináris (nem decimális) pontot úgy feltételezhetjük, hogy csak a kezdő 1-es jobb oldalán található.

A lebegőpontos ábrázolás formátuma a következő:

Formátum bájt 1 bájt 2 bájt 3 bájt 4 ... bájt n
egypontos pontosság SXXXXXXX XMMMMMMM MMMMMMMM MMMMMMMM
dupla pontosság SXXXXXXX XXXXMMMM MMMMMMMM MMMMMMMM ... MMMMMMMM

S a jelbitet jelöli, az X's az elfogult kitevő biteket, az M's pedig a significand biteket. A bal szélső bitet egypontos és dupla pontosságú formátumban feltételezzük.

A bináris pont megfelelő eltolásához először bontsa ki a kitevőt, majd helyezze a bináris pontot jobbra vagy balra a megfelelő számú bitre.

Speciális értékek

A lebegőpontos formátumok közé tartozik néhány speciálisan kezelt érték.

Nulla

A nullát nem lehet normalizálni, így az egy pontosságú vagy dupla pontosságú érték normalizált formájában nem jeleníthető meg. Egy speciális bitminta, mely összes nullát tartalmaz, a 0 értéket jelöli. A -0 a jelbitkészlettel nullának is jelölhető, de a -0 és a 0 mindig egyenlő.

Végtelenek

A +∞ és a −∞ értékeket úgy ábrázoljuk, hogy az összes kitevő egyekből áll, a mantissza pedig csupa nulla. A pozitív és a negatív értékeket a jelbit használatával jelöljük.

Alnormálisok

Normalizált formában a legkisebb számnál kisebb nagyságrendű számokat is jelölhet. Alnormális vagy denormális számoknak nevezik őket. Ha a kitevő mind nullák, és a significand nem nulla, akkor a significand implicit kezdő bitje nulla, nem pedig egy. A szubnormális számok pontossága csökken, ahogy az előjelben lévő kezdő nullák száma felmegy.

NaN – Nem szám

Az IEEE lebegőpontos formátumában olyan értékeket jelölhet, amelyek nem valós számok, például 0/0. Az ilyen típusú értékeket NaN-nek nevezzük. A NaN-t az összes kitevője és egy nem nulla jel jelöli. Kétféle NaN létezik: a csendes NaN-ok vagy QNaN-ok, és a jelző NaN-ok vagy SNaN-ok. A csendes naN-eknek van egy vezető karakterük a jeligében, és egy kifejezésen keresztül propagálják. Meghatározhatatlan értéket jelölnek, például a végtelenel való osztás eredményét, vagy a végtelen nullával való szorzását. A jelző naN-eknek van egy kezdő nullája a jeladóban. Olyan érvénytelen műveletekhez használják őket, amelyek lebegőpontos hardverkivételt jeleznek.

Példák

Az alábbiakban néhány példát láthat egyszeres pontosságú formátumban.

  • A 2 értéknél a jelbit nulla. A tárolt kitevő 128 vagy 1000 0000 bináris érték, ami 127 plusz 1. A tárolt bináris jelentőségű érték (1.) 000 0000 0000 0000 0000 0000, amely egy hallgatólagosan feltételezett vezető 1-est és bináris pontot tartalmaz, így a tényleges jelentőségi érték egy.

    Érték Képlet Bináris ábrázolás Hexadecimális
    2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000
  • A -2 érték. Ugyanaz, mint a +2, kivéve, hogy a jelbit be van állítva. Ugyanez igaz az összes IEEE formátumú lebegőpontos szám negatívjára is.

    Érték Képlet Bináris ábrázolás Hexadecimális
    -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000
  • Az érték 4. Ugyanaz a mantissza, a kitevő eggyel növekszik (az elfogult érték 129, binárisan 100 0000 1).

    Érték Képlet Bináris ábrázolás Hexadecimális
    4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000
  • Az érték 6. Ugyanaz a kitevő, significand a felével nagyobb. Ez (1.) 100 0000 ... 0000 0000, ami mivel bináris tört, 1 1/2, mert a tört számjegyeinek értéke 1/2, 1/4, 1/8 és így tovább.

    Érték Képlet Bináris ábrázolás Hexadecimális
    6 1.5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000
  • Az érték 1. Ugyanaz a számítvány, mint más kettő hatványoknál, az elfogult kitevő eggyel kevesebb, mint kettő a 127-en, vagy 011 1111 1 binárisan.

    Érték Képlet Bináris ábrázolás Hexadecimális
    1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000
  • Az érték 0,75. Az elfogult kitevő 126, 011 1111 0 bináris, és a significand (1.) 100 0000 ... 0000 0000, ami 1 1/2.

    Érték Képlet Bináris ábrázolás Hexadecimális
    0,75 1.5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000
  • Az érték 2,5. Pontosan ugyanaz, mint két, kivéve, hogy a bit, amely 1/4 van beállítva a significand.

    Érték Képlet Bináris ábrázolás Hexadecimális
    2,5 1.25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000
  • Az 1/10 egy ismétlődő tört bináris formátumban. A significand egy kicsit kevesebb, mint 1,6, és az elfogult exponens azt mondja, hogy az 1,6-ot kellene osztani 16-tal. (Ez 011 1101 1 bináris, ami 123 decimális.) A valódi kitevő 123 - 127 = -4, ami azt jelenti, hogy a szorzási tényező 2-4 = 1/16. A tárolt előjelet a rendszer az utolsó bitben kerekíti fel, hogy a lehető legpontosabban ábrázolja a nem megjeleníthető számot. (Annak az oka, hogy az 1/10 és az 1/100 nem pontosan ábrázolható binárisan, hasonló ahhoz az okhoz, hogy az 1/3 nem pontosan ábrázolható decimálisan.)

    Érték Képlet Bináris ábrázolás Hexadecimális
    0,1 1.6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD
  • A nulla egy különleges eset. A képletet a lehető legkisebb ábrázolható pozitív értékhez használja, amely mind nullák.

    Érték Képlet Bináris ábrázolás Hexadecimális
    0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000

Lásd még

Miért veszítik el a pontosságot Floating-Point számok?