V počítačové vědě je IEEE 754 standardem pro aritmetiku s plovoucí desetinnou čárkou vyvinutý institutem elektrotechnických a elektronických inženýrů . V současné době je nejpoužívanějším standardem pro výpočet čísel s plovoucí desetinnou čárkou u CPU a FPU . Standard definuje formáty pro reprezentaci čísel s plovoucí desetinnou čárkou ( znaménko , mantisa , exponent , denormalizovaná čísla ) a speciální hodnoty ( nekonečné a NaN ) spolu se sadou operací s plovoucí desetinnou čárkou. Popisuje také pět režimů zaokrouhlování a pět výjimek (včetně podmínek, za kterých dojde k výjimce, a co se v takovém případě stane).
Původní verze IEEE 754 z roku 1985 definovala čtyři formáty pro reprezentaci čísel plovoucí desetinné čárky základny 2:
Například v jazyce C používá kompilátor gcc pro 32bitové architektury kompatibilní s Intelem formát jedné přesnosti pro proměnné typu float , dvojité přesnosti pro proměnné typu double a dvojité přesnosti nebo rozšířené dvojité přesnosti (podle operačního systému) pro dlouhé dvojité proměnné . Pokud se však rozšíření SSE2 nepoužívá, všechny výpočty se zaokrouhlí na stejnou přesnost v závislosti na nastavení dynamické přesnosti procesoru (obvykle dvojnásobná přesnost nebo rozšířená dvojitá přesnost, v závislosti na operačním systému, možnostech kompilace a změnách provedených programy).
Plný název standardu byl IEEE Standard for Binary Floating-Point Arithmetic (ANSI / IEEE Std 754-1985 ). Je známá také pod názvem IEC 60559: 1989, Binární aritmetika s plovoucí desetinnou čárkou pro mikroprocesorové systémy , což z ní také dělá (americký) standard, protože je schválen jako normativní odkaz v několika mezinárodních normách ISO. Tento standard byl však rozšířen významnou revizí v roce 2008 o další základní formáty (binární na 128 bitech a desetinná místa na 64 a 128 bitech), jakož i na výměnné formáty (přidáním méně přesných nebo přesnějších formátů) a rozšířené formáty ( zobecnění standardu z roku 1985 s větší volností v přesnosti a kódování než v případě výměnných formátů); tato revize také zahrnuje další režimy zaokrouhlování a přísnější požadavky na shodu týkající se očekávané přesnosti základních výpočtů a operací základních transcendentálních funkcí. Tato norma byla revidována také v roce 2019.
Ve slově délky W jsou bity indexovány od 0 do W - 1 včetně. Bit 0 je umístěn vpravo a představuje nejméně významný bit (tj. Bit jednotek, který při změně způsobí nejmenší variantu).
Číslo s plovoucí desetinnou čárkou se skládá ze tří prvků: mantisy , exponentu a znaménka. Nejvýznamnějším bitem je bit znaménka : pokud je tento bit na 1, je číslo záporné a pokud je na 0, je číslo kladné. Další e bity představují předpjatý exponent (kromě speciální hodnoty) a další m bity ( m nejméně významné bity) představují mantisu.
Podepsat | Bias exponent | Mantissa |
(1 bit) | ( e bitů) | ( m bitů) |
Exponent může být kladný nebo záporný. Obvyklá reprezentace podepsaných čísel ( doplněk 2 ) by však srovnání čísel s plovoucí desetinnou čárkou trochu ztížila. Abychom tento problém vyřešili, exponent je „zkosený“, aby jej mohl uložit jako nepodepsané číslo.
Toto zkreslení je 2 e −1 - 1 ( e představuje počet bitů v exponentu); jde tedy o konstantní hodnotu, jakmile je počet bitů e pevný.
Interpretace čísla (jiného než nekonečna) je tedy: hodnota = znaménko × mantisa × 2 ( exponent - zkreslení ) s
Nejvýznamnější bit mantisy je určen hodnotou předpjatého exponenta. Pokud je předpjatý exponent odlišný od 0 a od , nejvýznamnější bit mantisy je 1 a číslo je označeno jako „normalizované“. Pokud je předpjatý exponent nula, nejvýznamnější bit mantisy je nula a číslo je denormalizováno .
Existují tři speciální případy:
Můžeme to shrnout takto:
Typ | Bias exponent | Mantissa |
---|---|---|
Nuly | 0 | 0 |
Denormalizovaná čísla | 0 | odlišné od 0 |
Normalizovaná čísla | na | žádný |
Nekonečný | 0 | |
NaNs | odlišné od 0 |
Číslo s plovoucí desetinnou čárkou s přesnou přesností je uloženo ve 32bitovém slově : 1 znakový bit, 8 bitů pro exponenta a 23 pro mantisu.
Exponent je tedy v tomto případě předpjatý . Exponent normalizovaného čísla proto jde od -126 do +127. Exponent -127 (který je předpjatý směrem k hodnotě 0) je rezervován pro nula a denormalizovaná čísla, zatímco exponent 128 (předpjatý směrem k 255) je vyhrazen pro kódování nekonečen a NaN (viz předchozí tabulka).
Normalizované číslo s plovoucí desetinnou čárkou má hodnotu v danou následujícím vzorcem:
v = s × 2 e × m .Například pro 0b 0 01111100 01000000000000000000000: znaménko je kladné, exponent je 124 - 127 = −3 a významná část je 0b 1,01, tj. 1,25 v desítkové soustavě (1 × 2 0 + 0 × 2 −1 + 1 × 2 - 2 ); zastoupené číslo je tedy +1,25 × 2 −3 nebo +0,15625.
Denormalizovaná čísla se řídí stejným principem, až na to, že e = −126 a m = 0+ mantisa (poznámka: pro výpočet se postaráme o e = −126 a ne −127, abychom zaručili kontinuitu tohoto reprezentace s normalizovanou reprezentací, protože m = 0+ mantisa a již m = 1+ mantisa ).
Poznámky:
Zde je tabulka shrnující předchozí část s příklady přesných 32bitových čísel.
Typ | Vystavovatel | Mantissa | Přibližná hodnota | Odchylka / předchozí |
---|---|---|---|---|
Nula | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0,0 | |
Nejmenší denormalizované číslo | 0000 0000 | 000 0000 0000 0000 0000 0001 | 1,4 × 10 −45 | 1,4 × 10 −45 |
Další denormalizované číslo | 0000 0000 | 000 0000 0000 0000 0000 0010 | 2,8 × 10 −45 | 1,4 × 10 −45 |
Další denormalizované číslo | 0000 0000 | 000 0000 0000 0000 0000 0011 | 4,2 × 10 −45 | 1,4 × 10 −45 |
Jiné denormalizované číslo | 0000 0000 | 100 0000 0000 0000 0000 0000 | 5,9 × 10 −39 | |
Největší denormalizované číslo | 0000 0000 | 111 1111 1111 1111 1111 1111 | 1,175 494 21 × 10 −38 | |
Nejmenší standardizované číslo | 0000 0001 | 000 0000 0000 0000 0000 0000 | 1,175 494 35 × 10 −38 | 1,4 × 10 −45 |
Další standardizované číslo | 0000 0001 | 000 0000 0000 0000 0000 0001 | 1,175 494 49 × 10 −38 | 1,4 × 10 −45 |
Téměř dvojnásobné | 0000 0001 | 111 1111 1111 1111 1111 1111 | 2,350 988 56 × 10 −38 | 1,4 × 10 −45 |
Další standardizované číslo | 0000 0010 | 000 0000 0000 0000 0000 0000 | 2,350 988 70 × 10 −38 | 1,4 × 10 −45 |
Další standardizované číslo | 0000 0010 | 000 0000 0000 0000 0000 0001 | 2,350 988 98 × 10 −38 | 2,8 × 10 −45 |
Téměř 1 | 0111 1110 | 111 1111 1111 1111 1111 1111 | 0,999 999 94 | 0,6 × 10 −7 |
1 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1 000 000 00 | |
Další číslo 1 | 0111 1111 | 000 0000 0000 0000 0000 0001 | 1 000 000 12 | 1,2 × 10 −7 |
Téměř největší počet | 1111 1110 | 111 1111 1111 1111 1111 1110 | 3 402 823 26 × 10 38 | |
Největší standardizované číslo | 1111 1110 | 111 1111 1111 1111 1111 1111 | 3 402 823 46 × 10 38 | 2 × 10 31 |
Nekonečný | 1111 1111 | 000 0000 0000 0000 0000 0000 | Nekonečný | |
První (denormalizovaná) hodnota varování NaN | 1111 1111 | 000 0000 0000 0000 0000 0001 | ani náhodou | |
Normalizovaný NaN (alarm) | 1111 1111 | 010 0000 0000 0000 0000 0000 | ani náhodou | |
Poslední (denormalizovaná) hodnota varování NaN | 1111 1111 | 011 1111 1111 1111 1111 1111 | ani náhodou | |
První (denormalizovaná) hodnota tichého NaN | 1111 1111 | 100 0000 0000 0000 0000 0000 | ani náhodou | |
Poslední (denormalizovaná) hodnota tichého NaN | 1111 1111 | 111 1111 1111 1111 1111 1111 | ani náhodou |
Poznámky:
Pojďme kódovat desetinné číslo −118 625 pomocí mechanismu IEEE 754.
Proto máme −118 625 (dec) = 1100 0010 1110 1101 0100 0000 0000 0000 (bin) = C2ED4000 (hexa).
Formát dvojité přesnosti je stejný jako jednoduchá přesnost, kromě toho, že pole jsou větší. Ve skutečnosti má 52 mantisových bitů místo pouhých 23 a 11 exponentových bitů místo pouhých 8.
Mantisa je velmi široká, zatímco exponent není příliš široký. Je to proto, že podle tvůrců standardu je přesnost důležitější než amplituda.
NaN a nekonečny jsou reprezentovány nastavením všech bitů exponentu na 1 (2047), ale odlišují se nastavením všech 52 bitů mantisy na 0 pro nekonečna a alespoň jednu z těchto 52 bitů na 1 pro Nope .
U normalizovaných čísel je zkreslení exponentů +1023. U denormalizovaných čísel je exponent −1022 (minimální exponent pro normalizované číslo). Není to −1023, protože normalizovaná čísla mají 1 před desetinnou čárkou a denormalizovaná čísla nikoli. Stejně jako dříve jsou podepsány nula a nekonečno.
Poznámky:
Obecně je nejlepší porovnávat čísla s pohyblivou řádovou čárkou pomocí pokynů pro výpočet s pohyblivou řádovou čárkou. Tato reprezentace však umožňuje srovnání určitých podmnožin po bajtech, pokud mají stejné pořadí bajtů a stejné znaménko a NaN jsou vyloučeny.
Například pro dvě kladná čísla s plovoucí desetinnou čárkou a a b dává srovnání mezi a a b (>, <nebo ==) stejné výsledky jako srovnání dvou podepsaných (nebo nepodepsaných) čísel se stejnými bity jako a a b. Jinými slovy, dvě kladná čísla s plovoucí desetinnou čárkou (která nejsou NaN) lze porovnat s podepsaným (nebo nepodepsaným) binárním porovnáním. Kvůli problému s objednávkou bytů nelze toto srovnání použít v přenosném kódu.
Standard IEEE specifikuje 5 režimů zaokrouhlování:
v červen 2008, IEEE schválila zásadní revizi standardů IEEE 754 a IEEE 854. Viz: IEEE 754-2008 (en) .
Tato revize přináší nové formáty základny 2 a základny 10 a specifikuje zastoupení formátů základny 10 (kromě základny 2).
Normalizuje také relaci celkové objednávky pro každý z normalizovaných číselných datových typů a doplňuje obvyklé relace objednávky, které jsou pouze částečné; vztah normálního řádu je skutečně celkový pouze za podmínky, že z množiny hodnot bude odstraněna záporná nulová hodnota (obvykle srovnávaná jako rovná kladné nulové hodnotě) a všechny hodnoty NaN (které nejsou ani stejné, ani nadřazené, ani horší než ostatní, dokonce ani oni sami).
Na druhou stranu tato revize ponechává flexibilitu reprezentace a možné rozlišení hodnot NaN (pozice a hodnota varovných bitů v poli mantisy nejsou standardizovány a použití dalších bitů pole mantisy nebo znaménko hodnoty NaN ke kódování chyby zůstává závislé na architektuře nebo aplikacích).
Nová revize byla schválena v července 2019.