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.

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í:

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ě:

IEEE 754 Double Floating Point Format.svg

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: 00000000001200116 (nejmenší exponent pro normální čísla )
e = = = 1023: 0111111111123ff16 (nulový posun)
e = = = 1029: 10000000101240516
e = = = 2046: 1111111111027fe16 (nejvyšší představitel)

Exponenty a mají zvláštní význam: 000167ff16

  • 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ů doubletyp 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

Poznámky a reference