Formát s plovoucí desetinnou čárkou s dvojitou přesností- Double-precision floating-point format
Formát s plovoucí desetinnou čárkou s dvojitou přesností (někdy nazývaný FP64 nebo float64 ) je formát počítačového čísla , který obvykle zabírá 64 bitů v paměti počítače; představuje široký dynamický rozsah číselných hodnot pomocí plovoucího bodu radix .
Plovoucí desetinná čárka se používá k vyjádření zlomkových hodnot, nebo když je zapotřebí širší rozsah, než jaký poskytuje pevný bod (stejné šířky bitů), i když za cenu přesnosti. Dvojitou přesnost lze zvolit v případě, že rozsah nebo přesnost jednoduché přesnosti nebude dostatečná.
Ve standardu IEEE 754-2008 je 64bitový formát base-2 oficiálně označován jako binary64 ; v IEEE 754-1985 se tomu říkalo double . IEEE 754 specifikuje další formáty s plovoucí desetinnou čárkou, včetně 32bitové jednoduché přesnosti base-2 a nověji reprezentace base-10.
Jedním z prvních programovacích jazyků, které poskytovaly datové typy s plovoucí desetinnou čárkou s jednoduchou a dvojitou přesností, byl Fortran . Před všeobecným přijetím IEEE 754-1985, reprezentace a vlastnosti datových typů s plovoucí desetinnou čárkou závisely na výrobci počítače a počítačovém modelu a na rozhodnutích implementátorů programovacího jazyka. Například datový typ GW-BASIC s dvojitou přesností byl 64bitový formát MBF s plovoucí desetinnou čárkou.
Formáty s plovoucí desetinnou čárkou |
---|
IEEE 754 |
jiný |
Binární formát s plovoucí desetinnou čárkou s dvojitou přesností IEEE 754: binary64
Binární číslo s dvojitou přesností s plovoucí desetinnou čárkou je běžně používaný formát na počítačích, a to díky svému širšímu rozsahu oproti plovoucí desetinné čárce s jednou přesností, a to navzdory výkonu a nákladům na šířku pásma. To je běžně známé jednoduše jako dvojité . Standard IEEE 754 specifikuje binary64 jako mající:
- Signální bit : 1 bit
- Exponent : 11 bitů
- Významná přesnost : 53 bitů (52 výslovně uloženo)
Znaménkový bit určuje znaménko čísla (včetně případů, kdy je toto číslo nula, což je podepsáno ).
Pole exponent je 11bitové celé číslo bez znaménka od 0 do 2047 ve zkresleném tvaru : hodnota exponentu 1023 představuje skutečnou nulu. Exponenty se pohybují od −1022 do +1023, protože exponenty −1023 (všechny 0 s) a +1024 (všechny 1 s) jsou vyhrazeny pro speciální čísla.
53bitová významná přesnost udává přesnost od 15 do 17 platných desetinných číslic (2 −53 ≈ 1,11 × 10 −16 ). Pokud je desetinný řetězec s nejvýše 15 platnými číslicemi převeden na reprezentaci dvojité přesnosti IEEE 754 a poté převeden zpět na desetinný řetězec se stejným počtem číslic, konečný výsledek by měl odpovídat původnímu řetězci. Pokud je číslo IEEE 754 s dvojitou přesností převedeno na desetinný řetězec s alespoň 17 platnými číslicemi a poté převedeno zpět na reprezentaci s dvojitou přesností, konečný výsledek se musí shodovat s původním číslem.
Formát je zapsán s významem, který má implicitní celočíselný bit hodnoty 1 (kromě speciálních dat, viz kódování exponent níže). S 52 bity zlomku (F), které se objevují v paměťovém formátu, je celková přesnost tedy 53 bitů (přibližně 16 desetinných číslic, 53 log 10 (2) ≈ 15,955). Bity jsou rozloženy následovně:
Skutečná hodnota předpokládaná daným 64bitovým datem s dvojitou přesností s daným zkresleným exponentem a 52bitovým zlomkem je
nebo
Mezi 2 52 = 4,503,599,627,370,496 a 2 53 = 9,007,199,254,740,992 představují reprezentovatelná čísla přesně celá čísla. Pro další rozsah od 2 53 do 2 54 je vše vynásobeno 2, takže reprezentovatelná čísla jsou sudá atd. Naopak pro předchozí rozsah od 2 51 do 2 52 je rozteč 0,5 atd.
Mezera jako zlomek čísel v rozsahu od 2 n do 2 n +1 je 2 n -52 . Maximální relativní chyba zaokrouhlení při zaokrouhlení čísla na nejbližší reprezentovatelné číslo ( epsilon stroje ) je tedy 2 −53 .
Šířka 11 bit exponentu umožňuje znázornění čísla mezi 10 -308 a 10 308 , s plnou 15-17 desetinnými místy přesnosti. Snížením přesnosti umožňuje subnormální reprezentace ještě menší hodnoty až do přibližně 5 × 10 −324 .
Kódování exponentů
Exponent binární plovoucí desetinné čárky s dvojitou přesností je kódován pomocí offset-binární reprezentace, přičemž nulový offset je 1023; také známý jako zkreslení exponentu ve standardu IEEE 754. Příklady takových reprezentací by byly:
e = = = 1:
000000000012 00116 |
(nejmenší exponent pro normální čísla ) | ||
e = = = 1023:
011111111112 3ff16 |
(nulový posun) | ||
e = = = 1029:
100000001012 40516 |
|||
e = = = 2046:
111111111102 7fe16 |
(nejvyšší představitel) |
Exponenty a mají zvláštní význam:
00016
7ff16
-
000000000002
= se používá k reprezentaci podepsané nuly (pokud F = 0) a subnormálů (pokud F ≠ 0); a00016
-
111111111112
= se používá k reprezentaci ∞ (pokud F = 0) a NaNs (pokud F ≠ 0),7ff16
kde F je zlomková část významu . Všechny bitové vzory jsou platným kódováním.
Kromě výše uvedených výjimek je celé číslo s dvojitou přesností popsáno:
V případě subnormálů ( e = 0) číslo s dvojitou přesností popisuje:
Endianness
Ačkoli dnešní všudypřítomné procesory x86 používají úložiště typu endian pro všechny typy dat (celé číslo, plovoucí desetinná čárka), existuje řada hardwarových architektur, kde jsou čísla s plovoucí desetinnou čárkou zastoupena v podobě typu big-endian, zatímco celá čísla jsou zastoupena v malém- endianská forma. Existují procesory ARM, které mají poloviční reprezentaci s plovoucí desetinnou čárkou s malou koncovkou, napůl s velkou koncovou hodnotou: obě 32bitová slova jsou uložena v malých endianech jako celočíselné registry, ale nejdřív to nejdůležitější. Protože existuje mnoho formátů s plovoucí desetinnou čárkou, které pro ně nemají žádné „ síťové “ standardní zastoupení, používá standard XDR jako reprezentaci big-endian IEEE 754. Může se proto zdát divné, že rozšířený standard IEEE 754 s plovoucí desetinnou čárkou neurčuje endianness. Teoreticky to znamená, že ani standardní IEEE data s plovoucí desetinnou čárkou zapsaná jedním počítačem nemusí být čitelná na jiném. Na moderních standardních počítačích (tj. Implementujících IEEE 754) však lze v praxi bezpečně předpokládat, že endianness je pro čísla s plovoucí desetinnou čárkou stejný jako pro celá čísla, takže převod je přímočarý bez ohledu na datový typ. (Malé vestavěné systémy využívající speciální formáty s plovoucí desetinnou čárkou však mohou být jiná věc.)
VAX s plovoucí desetinnou čárkou ukládá 16bitová slova s malým endianem v pořadí big-endian.Příklady dvojité přesnosti
0 01111111111 000000000000000000000000000000000000000000000000000000000000 2 ≙ 3FF0 0000 0000 0000 16 ≙ +2 0 × 1 = 1 |
0 01111111111 00000000000000000000000000000000000000000000000000000001 2 ≙ 3FF0 0000 0000 0001 16 ≙ +2 0 × (1 + 2 −52 ) ≈ 1,000000000000002, nejmenší číslo> 1 |
0 01111111111 0000000000000000000000000000000000000000000000000000000010 2 ≙ 3FF0 0000 0000 0002 16 ≙ +2 0 × (1 + 2 −51 ) ≈ 1,000000000000004 |
0 10000000000 0000000000000000000000000000000000000000000000000000000000 2 ≙ 4000 0000 0000 0000 16 ≙ +2 1 × 1 = 2 |
1 10000000000 0000000000000000000000000000000000000000000000000000000000 2 ≙ C000 0000 0000 0000 16 ≙ −2 1 × 1 = −2 |
0 10000000000 1000000000000000000000000000000000000000000000000000000000 2 ≙ 4008 0000 0000 0000 16 ≙ +2 1 × 1,1 2 = 11 2 = 3 |
0 10000000001 0000000000000000000000000000000000000000000000000000000000 2 ≙ 4010 0000 0000 0000 16 ≙ +2 2 × 1 = 100 2 = 4 |
0 10000000001 0100000000000000000000000000000000000000000000000000000000 2 ≙ 4014 0000 0000 0000 16 ≙ +2 2 × 1,01 2 = 101 2 = 5 |
0 10000000001 1000000000000000000000000000000000000000000000000000000000 2 ≙ 4018 0000 0000 0000 16 ≙ +2 2 × 1,1 2 = 110 2 = 6 |
0 10000000011 0111000000000000000000000000000000000000000000000000000000 2 ≙ 4037 0000 0000 0000 16 ≙ +2 4 × 1,0111 2 = 10111 2 = 23 |
0 01111111000 1000000000000000000000000000000000000000000000000000000000 2 ≙ 3F88 0000 0000 0000 16 ≙ +2 −7 × 1,1 2 = 0,00000011 2 = 0,01171875 (3/256) |
0 00000000000 0000000000000000000000000000000000000000000000000000001 2 ≙ 0000 0000 0000 0001 16 ≙ +2 −1022 × 2 −52 = 2 −1074 ≈ 4,9406564584124654 × 10 −324 (min. Podnormální kladný dvojnásobek) |
0 00000000000 1111111111111111111111111111111111111111111111111111 2 ≙ 000F FFFF FFFF FFFF 16 ≙ 2 -1022 x (1 - 2 -52 ) ≈ 2,2250738585072009 x 10 -308 (max podnormální double). |
0 00000000001 0000000000000000000000000000000000000000000000000000 2 ≙ 0010 0000 0000 0000 16 ≙ 2 -1022 x 1 ≈ 2,2250738585072014 x 10 -308 (Min. Normální pozitivní double) |
0 11111111110 1111111111111111111111111111111111111111111111111111 2 ≙ 7FEF FFFF FFFF FFFF 16 ≙ 2 1023 x (1 + (1 - 2 -52 )) ≈ 1,7976931348623157 x 10 308 (max. Double) |
0 00000000000 0000000000000000000000000000000000000000000000000000000000 2 ≙ 0000 0000 0000 0000 16 ≙ +0 |
1 00000000000 0000000000000000000000000000000000000000000000000000000000 2 ≙ 8000 0000 0000 0000 16 ≙ −0 |
0 11111111111 0000000000000000000000000000000000000000000000000000000000 2 ≙ 7FF0 0000 0000 0000 16 ≙ +∞ (kladné nekonečno) |
1 11111111111 0000000000000000000000000000000000000000000000000000000000 2 ≙ FFF0 0000 0000 0000 16 ≙ −∞ (negativní nekonečno) |
0 11111111111 00000000000000000000000000000000000000000000000000000001 2 ≙ 7FF0 0000 0000 0001 16 ≙ NaN (sNaN u většiny procesorů, jako jsou x86 a ARM) |
0 11111111111 1000000000000000000000000000000000000000000000000000000001 2 ≙ 7FF8 0000 0000 0001 16 ≙ NaN (qNaN u většiny procesorů, jako jsou x86 a ARM) |
0 11111111111 111111111111111111111111111111111111111111111111111111111111 2 ≙ 7FFF FFFF FFFF FFFF 16 ≙ NaN (alternativní kódování NaN) |
0 01111111101 0101010101010101010101010101010101010101010101010101 2 = 3FD5 5555 5555 5555 16 ≙ 2 -2 x (1 + 2 -2 + 2 -4 + ... + 2 -52 ) ≈ 1 / 3 |
0 10000000000 100100100001111110110101010100010001000010110100011000 2 = 4009 21FB 5444 2D18 16 ≈ pi |
Kódování qNaN a sNaN není v IEEE 754 zcela specifikováno a závisí na procesoru. Většina procesorů, jako jsou procesory řady x86 a ARM , používá k označení tichého NaN nejvýznamnější bit pole Význam; to je to, co doporučuje IEEE 754. Procesory PA-RISC používají bit k označení signalizačního NaN.
Ve výchozím nastavení je 1 / 3 kola dolů, místo toho se jako jediný přesnost , a to z důvodu lichým počtem bitů v mantisy.
Podrobněji:
Given the hexadecimal representation 3FD5 5555 5555 555516, Sign = 0 Exponent = 3FD16 = 1021 Exponent Bias = 1023 (constant value; see above) Fraction = 5 5555 5555 555516 Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here = 2−2 × (15 5555 5555 555516 × 2−52) = 2−54 × 15 5555 5555 555516 = 0.333333333333333314829616256247390992939472198486328125 ≈ 1/3
Rychlost provedení s aritmetikou s dvojitou přesností
Použití proměnných s plovoucí desetinnou čárkou s dvojitou přesností a matematických funkcí (např. Sin, cos, atan2, log, exp a sqrt) je pomalejší než práce s jejich protějšky s jednou přesnou přesností. Jednou z oblastí výpočetní techniky, kde se jedná o konkrétní problém, je paralelní kód běžící na GPU. Například, při použití NVIDIA s CUDA platformu, výpočty s dvojitou přesností odběru v závislosti na hardwaru, přibližně 2 až 32 krát tak dlouho, než se dokončí v porovnání s těmi provedeno pomocí jediné přesnost .
Přesná omezení celočíselných hodnot
- Lze přesně znázornit celá čísla od −2 53 do 2 53 (−9,007,199,254,740,992 až 9,007,199,254,740,992)
- Celá čísla mezi 2 53 a 2 54 = 18 014 398 509 481 984 zaokrouhlete na násobek 2 (sudé číslo)
- Celá čísla mezi 2 54 a 2 55 = 36 028 797 018 963 968 zaokrouhlená na násobek 4
Implementace
Dvojky jsou implementovány v mnoha programovacích jazycích různými způsoby, například následujícími. U procesorů s pouze dynamickou přesností, jako je x86 bez SSE2 (nebo když SSE2 není použito z důvodu kompatibility) a s rozšířenou přesností používanou ve výchozím nastavení, může mít software potíže s plněním některých požadavků.
C a C ++
C a C ++ nabízejí širokou škálu aritmetických typů . Dvojitá přesnost není standardy vyžadována (kromě volitelné přílohy F C99 pokrývající aritmetiku IEEE 754), ale u většiny systémů double
typ odpovídá dvojnásobné přesnosti. Na 32bitových x86 s rozšířenou přesností ve výchozím nastavení však některé kompilátory nemusí odpovídat standardu C nebo může aritmetika trpět dvojitým zaokrouhlováním .
Fortran
Fortran poskytuje několik celočíselných i reálných typů a 64bitový typ real64
, přístupný přes vnitřní modul Fortranu iso_fortran_env
, odpovídá dvojnásobné přesnosti.
Lisp
Common Lisp nabízí typy SHORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT a LONG-FLOAT. Většina implementací poskytuje SINGLE-FLOATs a DOUBLE-FLOATs s jinými typy vhodných synonym. Common Lisp poskytuje výjimky pro zachycení podtečení a přetečení s plovoucí desetinnou čárkou a nepřesnou výjimku s pohyblivou řádovou čárkou podle IEEE 754. Standard ANSI nepopisuje žádná nekonečna a NaN, nicméně několik implementací je poskytuje jako rozšíření.
Jáva
V Javě před verzí 1.2 musela být každá implementace kompatibilní s IEEE 754. Verze 1.2 umožňovala implementacím přinést extra přesnost v mezilehlých výpočtech pro platformy jako x87 . Proto byl zaveden modifikátor strictfp k vynucení přísných výpočtů IEEE 754. V Javě 17 byla obnovena přísná plovoucí čárka.
JavaScript
Jak specifikuje standard ECMAScript , veškerá aritmetika v JavaScriptu se provádí pomocí aritmetiky s plovoucí desetinnou čárkou s dvojitou přesností.
Viz také
- IEEE 754 , IEEE standard pro aritmetiku s pohyblivou řádovou čárkou