Sdílet prostřednictvím


Reprezentace plovoucí desetinné čárky IEEE

Microsoft C++ (MSVC) je konzistentní s číselnými standardy IEEE. Standard IEEE-754 popisuje formáty s plovoucí desetinou čárkou, způsob, jak znázorňovat reálná čísla v hardwaru. Existuje alespoň pět interních formátů pro čísla s plovoucí desetinnou čárkou, které jsou reprezentovatelné v hardwaru cíleném kompilátorem MSVC. Kompilátor používá pouze dva z nich. Formáty s jednoduchou přesností (4 bajty) a dvojitou přesností (8 bajtů) se používají v MSVC. Jednoduchá přesnost je deklarována pomocí klíčového slova float. Dvojitá přesnost je deklarována pomocí klíčového slova double. Standard IEEE také určuje formáty s poloviční přesností (2 bajty) a čtyřbajtovou přesností (16bajty) a dvojitým rozšířeným formátem přesnosti (10 bajtů), který některé kompilátory jazyka C a C++ implementují jako long double datový typ. V kompilátoru long double MSVC se datový typ považuje za odlišný typ, ale typ úložiště se mapuje na double. K dispozici je však podpora vnitřního jazyka a jazyka sestavení pro výpočty pomocí jiných formátů, včetně formátu s dvojitou rozšířenou přesností, pokud je podporován hardwarem.

Hodnoty jsou uloženy následujícím způsobem:

Hodnota Uloženo jako
jednoduchá přesnost znaménko, 8bitová exponent, 23bitová significand
dvojitá přesnost znaménko, 11bitová exponent, 52bitová significand

Ve formátech s jednoduchou přesností a dvojitou přesností existuje předpokládané číslo 1 ve zlomkové části. Zlomková část se nazývá significand (někdy označovaná jako mantisa). Tato úvodní hodnota 1 není uložená v paměti, takže znakové znaménka jsou ve skutečnosti 24 nebo 53 bitů, i když se uloží jeden méně bitů. Formát s dvojitou rozšířenou přesností ve skutečnosti tento bit ukládá.

Exponenty jsou zkreslené o polovinu jejich možné hodnoty. To znamená, že odečtete tuto předsudku od uloženého exponentu, abyste získali skutečný exponent. Pokud je uložený exponent menší než odchylka, je to ve skutečnosti negativní exponent.

Exponenty jsou zkreslené následujícím způsobem:

Mocnina Zkreslení podle
8bitová (jednoduchá přesnost) 127
11bitová (dvojitá přesnost) 1023

Tyto exponenty nejsou mocné deset; jsou mocné ze dvou. To znamená, že 8bitové uložené exponenty mohou být v rozsahu -127 až 127, uložené jako 0 až 254. Hodnota 2127 je přibližně ekvivalentní 1038, což je skutečný limit jednoduché přesnosti.

Znak je uložen jako binární zlomek formuláře 1.XXX... . Tento zlomek má hodnotu větší nebo rovnou 1 a menší než 2. Reálná čísla jsou vždy uložena v normalizované podobě. To znamená, že znak a je posunut doleva tak, aby byl bit znaménka ve vysokém pořadí vždy 1. Vzhledem k tomu, že tento bit je vždy 1, předpokládá se (neukládá se) ve formátech s jednoduchou přesností a dvojitou přesností. Binární (nikoli desetinná čárka) se předpokládá, že je napravo od úvodního čísla 1.

Formát reprezentace s plovoucí desetinou čárkou je následující:

Formát bajt 1 bajt 2 bajt 3 bajt 4 ... byte n
jednoduchá přesnost SXXXXXXX XMMMMMMM MMMMMMMM MMMMMMMM
dvojitá přesnost SXXXXXXX XXXXMMMM MMMMMMMM MMMMMMMM ... MMMMMMMM

S představuje znaménko, X's jsou zkreslené exponentové bity a M's jsou significand bity. Bit úplně vlevo se předpokládá ve formátech s jednoduchou přesností a dvojitou přesností.

Pokud chcete binární bod správně posunout, nejprve zrušíte exponent a pak binární bod přesunete doprava nebo doleva odpovídající počet bitů.

Speciální hodnoty

Formáty s plovoucí desetinou čárkou zahrnují některé hodnoty, které jsou zpracovávány speciálně.

Nula

Nula nemůže být normalizována, takže není reprezentovatelná v normalizované podobě hodnoty s jednoduchou přesností nebo dvojitou přesností. Speciální bitový vzor všech nul představuje hodnotu 0. Je také možné znázorňovat hodnotu -0 jako nulu se znaménkem, ale hodnota -0 a 0 se vždy porovnávají stejně.

Infinity

Hodnoty +∞ a −∞ jsou reprezentovány exponentem všech hodnot a znakem, který je všech nul. Kladné a záporné jsou reprezentovány pomocí bitu znaménka.

Podnormály

Je možné znázornit čísla menšího rozsahu, než je nejmenší číslo v normalizované podobě. Nazývají se subnormální nebo denormální čísla. Pokud je exponent všechna nula a znak je nenulový, pak se implicitní úvodní bit znaku považuje za nula, nikoli jedna. Přesnost podnormálních čísel klesne, protože počet počátečních nul v significa uplyne.

NaN – nejedná se o číslo

Ve formátu IEEE s plovoucí desetinou čárkou je možné znázorňovat hodnoty, které nejsou skutečnými čísly, například 0/0. Hodnota tohoto typu se nazývá NaN. Hodnota NaN je reprezentována exponentem všech a nenulovým znakem a znakem, který není nulový. Existují dva druhy sítí NAN, tiché sítě NaN nebo sítě QNaN a signalizační sítě NAN nebo sítě SAN. Quiet NaNs má přední v significand a rozšíří se prostřednictvím výrazu. Představují neurčitou hodnotu, například výsledek dělení nekonečnem nebo vynásobením nekonečna nulou. Signalizační sítě NAN mají úvodní nulu v significandu. Používají se pro operace, které nejsou platné, k označení výjimky hardwaru s plovoucí desetinou čárkou.

Příklady

Tady je několik příkladů v jednoduchém formátu přesnosti:

  • Pro hodnotu 2 je bit znaménka nula. Uložený exponent je 128 nebo 1000 0000 v binární soustavě, což je 127 plus 1. Uložená binární significand je (1.) 000 0000 0000 0000 0000 0000, která má implicitní počáteční 1 a binární bod, takže skutečná znaková hodnota je jedna.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000
  • Hodnota -2. Stejné jako +2 s tím rozdílem, že je bit znaménka nastavený. Totéž platí pro záporná čísla ve formátu IEEE.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000
  • Hodnota 4. Stejné znaménka, exponent se zvyšuje o jednu (zkreslená hodnota je 129 nebo 100 0000 1 v binární soustavě.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    4 1 * 22 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000
  • Hodnota 6. Stejný exponent, significand je větší o polovinu. Je to (1.) 100 0000 ... 0000 0000, což, protože jde o binární zlomek, je 1 1/2, protože hodnoty desetinných číslic jsou 1/2, 1/4, 1/8 atd.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    6 1,5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000
  • Hodnota 1. Stejné znaménko a další mocniny dvou, zkreslený exponent je jeden menší než dva v 127 nebo 011 1111 1 v binární soustavě.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    0 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000
  • Hodnota 0,75. Zkreslený exponent je 126, 011 1111 0 v binární soustavě a znak je (1.) 100 0000 ... 0000 0000, což je 1 1/2.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    0.75 1,5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000
  • Hodnota 2,5. Přesně stejná jako dvě s tím rozdílem, že bit, který představuje 1/4, je nastaven v přihlašovacím znaku.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    2.5 1,25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000
  • 1/10 je opakující se zlomek v binární soustavě. Significand je o něco menší než 1,6 a zkreslený exponent říká, že 1,6 je děleno hodnotou 16. (Je to 011 1101 1 v binární soustavě, což je 123 v desítkové soustavě.) Skutečný exponent je 123 - 127 = -4, což znamená, že faktor, kterým se má násobit, je 2-4 = 1/16. Uložený znak je zaokrouhlen nahoru v posledním bitu pokusu o co nejpřesnější číslo. (Důvod, proč 1/10 a 1/100 nejsou přesně reprezentovatelné v binární soustavě, je podobný důvodu, že 1/3 není přesně reprezentovatelný v desítkové soustavě.)

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    0,1 1,6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD
  • Nula je zvláštní případ. Používá vzorec pro minimální možnou reprezentovatelnou kladnou hodnotu, což jsou všechny nuly.

    Hodnota Vzorec Binární reprezentace Šestnáctková hodnota
    0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000

Viz také

Proč čísla s plovoucí desetinnou čárkou můžou ztratit přesnost