Double-precision formátu s plovoucí desetinnou čárkou - Double-precision floating-point format


z Wikipedie, otevřené encyklopedie

Double-precision formátu s plovoucí desetinnou čárkou je formát čísla počítače , obvykle zabírá 64 bitů v paměti počítače; představuje široký dynamický rozsah číselných hodnot pomocí plovoucí radix bod.

Plovoucí bod se používá pro reprezentaci zlomkové hodnoty, nebo když je zapotřebí širší rozsah, než je stanoveno od pevného bodu (stejné šířky bitů), i když za cenu přesnosti. S dvojitou přesností může být zvolen, když je rozsah nebo přesnost jednoho přesnost by byla nedostatečná.

V IEEE 754-2008 standardu , formát 64-bit base-2 je oficiálně označován jako binary64 ; to bylo nazýváno double v IEEE 754-1985 . IEEE 754 specifikuje další formáty s plovoucí desetinnou čárkou, včetně 32-bit základnu-2 jediný přesností a v poslední době, base-10 reprezentací.

Jeden z prvních programovacích jazyků poskytovat jedno a dvojitou přesností plovoucí desetinnou čárkou datové typy byl Fortran . Před rozšířenému přijetí IEEE 754-1985, zastoupení a vlastnosti s plovoucí desetinnou čárkou datové typy závisí na výrobce počítače a počítačový model, a na základě rozhodnutí učiněných programovacího jazyka realizátorů. Eg, GW-BASIC ‚s dvojitou přesností datový typ byl 64-bit MBF formát s plovoucí desetinnou čárkou.

IEEE 754 dvojitou přesností v binárním formátu s plovoucí desetinnou čárkou: binary64

Double-precision binární s pohyblivou řádovou čárkou je běžně používaný formát na PC, díky širšímu okruhu přes jednoduchou přesností plovoucí desetinnou čárkou, navzdory svému výkonu a šířky pásma náklady. Stejně jako u jednoduchou přesností formátu s plovoucí desetinnou čárkou, postrádá přesnost na celých čísel ve srovnání s formátu celé číslo o stejné velikosti. To je obyčejně známý jednoduše jako double . 754 standard IEEE určuje binary64 že mají:

Nápis bit určuje znaménko čísla (včetně případů, kdy je toto číslo nula, která je podepsána ).

Pole exponent může být interpretován buď jako 11-bitové celé číslo se znaménkem od -1024 do 1023 ( 2 doplňku ) nebo 11-bitové celé číslo bez znaménka od 0 do 2047, který je přijat zaujatý forma v definici IEEE 754 binary64. Použije-li se bez znaménka formát celé číslo, hodnota exponent použitý v aritmetické je exponent posunut o vychýlení - pro IEEE 754 binary64 případě je hodnota exponent 1023 představuje skutečný nula (tj 2 e - 1023 jako jeden, e musí být 1023). Exponenty v rozmezí od -1022 do +1023 protože exponenty -1023 (všechny 0s) a +1024 (všechny 1s) jsou vyhrazeny pro speciální čísla.

53-bit mantisy přesnost dává 15 až 17 významné desetinná místa přesnosti (2 -53  ≈ 1,11 x 10 -16 ). Pokud desetinné řetězec s nejvýše 15 platných číslic je převeden na IEEE 754 s dvojitou přesností reprezentace, a pak se převede zpět na desítkové řetězec se stejným počtem číslic, by konečný výsledek odpovídá původní řetězec. Pokud je IEEE 754 dvojitou přesností číslo převede na desítkové řetězec s alespoň 17 významných číslic, a potom převeden zpět na dvojitou přesností reprezentace, musí konečný výsledek odpovídá původní číslo.

Tento formát je napsán s mantisy s implicitní celé číslo bit hodnotu 1 (s výjimkou zvláštní údaje, viz kódování exponent níže). S 52 bitů frakce mantisy uvedeného v formát paměti, celková přesnost je tedy 53 bitů (přibližně 16 desetinná místa, 53 log 10 (2) ≈ 15,955). Bity jsou stanoveny takto:

IEEE 754 Double Floating Point Format.svg

Skutečná hodnota předpokládá daným 64-bit s dvojitou přesností vztažného bodu s daným předpjaté exponentem a 52-bitový frakce A se

nebo

Mezi 2 52 = 4,503,599,627,370,496 a 2 53 = 9,007,199,254,740,992 se reprezentovatelné čísla jsou přesně celá čísla. Pro další řady, od 2 53 až 2 54 , vše, co se násobí 2, takže reprezentovatelné čísla jsou dokonce i ty, atd Naopak, za předchozí rozmezí od 2 51 až 2 52 , rozteč je 0,5, atd.

Rozteč jako podíl čísel v rozmezí od 2 n až 2 n + 1 je 2 n-52 . Maximální relativní chyba zaoblení při zaokrouhlení čísla na nejbližší reprezentovat jeden ( stroj epsilon ) 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. Vyzrazujícím přesnost, je odchylka reprezentace umožňuje i menší hodnoty až asi 5 x 10 -324 .

exponent kódování

Dvojitá přesnost binární s pohyblivou řádovou čárkou exponent je kódována za použití ofset-binární reprezentaci, s nulový posun je 1023; také známý jako exponentu předpětí ve standardu IEEE 754. Příklady takových reprezentací by bylo:

e = = = 1: 00000000001200116 (nejmenší exponent za normálních čísel )
e = = = 1023: 0111111111123ff16 (Nulového bodu)
e = = = 1029: 10000000101240516
e = = = 2046: 1111111111027fe16 (Nejvyšší exponent)

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

  • 000000000002= Se používá k reprezentaci podepsaný nulu (pokud je F = 0) a subnormals (je-li F ≠ 0); a00016
  • 111111111112= Se používá k reprezentaci (v případě, F = 0) a NaN (pokud F? 0),7ff16

kde F je zlomková část mantisy . Všechny bitové vzory jsou platné kódování.

S výjimkou výše uvedených výjimek, celé číslo s dvojitou přesností je popsán:

V případě subnormals ( e = 0), s dvojitou přesností číslo je popsán:

endianness

Ačkoli všudypřítomné x86 procesory dnes používají little-endian úložiště pro všechny typy dat (integer, plovoucí čárkou, BCD ), existuje celá řada hardwarových architektur, kde s plovoucí desetinnou čárkou jsou čísla zastoupena ve velkém-endian formě, zatímco celá čísla jsou zastoupeny little-endian forma. Existuje ARM procesory, které mají poloviční trochu endian, polovina big-endian reprezentace s plovoucí desetinnou čárkou za dvojitou přesností čísla: oba 32-bitová slova jsou uloženy v malém-endian jako celočíselných registrů, ale nejvýznamnější jeden první. Protože tam bylo mnoho formátů s plovoucí desetinnou čárkou bez „ sítě “ standardní reprezentaci pro ně je XDR standard používá big-endian IEEE 754 jako jeho zastoupení. Může se tedy zdát podivné, že rozšířené IEEE 754 standardu plovoucí desetinnou čárkou neurčuje endianness. Teoreticky to znamená, že i standardní údaje s plovoucí desetinnou čárkou IEEE viz jednom stroji nemusí být čitelné jiný. Nicméně, na moderních standardních počítačů (tj prováděcích IEEE 754), jeden může být v praxi bezpečně předpokládat, že endianness je stejná pro plovoucí desetinnou čárkou čísla jsou pro celá čísla, takže konverze jednoduché bez ohledu na typ dat. (Small vestavěných systémů pomocí speciálních formátů s plovoucí desetinnou čárkou, může být další záležitost nicméně.)

Dvojitou přesností příklady

0 01111111111 00000000000000000000000000000000000000000000000000002≙ 2 0 x 1 = 1
0 01111111111 00000000000000000000000000000000000000000000000000012≙ 2 0 x (1 + 2 -52 ) ≈ 1.0000000000000002, nejmenší číslo> 1
0 01111111111 00000000000000000000000000000000000000000000000000102≙ 2 0 x (1 + 2 -51 ) ≈ 1,0000000000000004
0 10000000000 00000000000000000000000000000000000000000000000000002≙ 2 1 x 1 = 2
1 10000000000 00000000000000000000000000000000000000000000000000002≙ -2 1 x 1 = -2
0 10000000000 10000000000000000000000000000000000000000000000000002≙ 2 1 x 1,1 2 = 11 2 = 3
0 10000000001 00000000000000000000000000000000000000000000000000002≙ 2 2 x 1 = 100 2 = 4
0 10000000001 01000000000000000000000000000000000000000000000000002≙ +2 2 x 1,01 2 = 101 2 = 5
0 10000000001 10000000000000000000000000000000000000000000000000002≙ 2 2 x 1,1 2 = 110 2 = 6
0 10000000011 01110000000000000000000000000000000000000000000000002≙ 2 4 x 1,0111 2 = 10111 2 = 23
0 00000000000 00000000000000000000000000000000000000000000000000012 ≙ 2 -1022 x 2 -52 = 2 -1074
≈ 4,9406564584124654 x 10 -324
(Min. Podnormální pozitivní double)
0 00000000000 11111111111111111111111111111111111111111111111111112 ≙ 2 -1022 x (1 - 2 -52 )
≈ 2,2250738585072009 x 10 -308
(Max. Podnormální double)
0 00000000001 00000000000000000000000000000000000000000000000000002 ≙ 2 -1022 x 1
≈ 2,2250738585072014 x 10 -308
(Min. Normální pozitivní double)
0 11111111110 11111111111111111111111111111111111111111111111111112 ≙ 2 1023 x (1 + (1 - 2 -52 ))
≈ 1,7976931348623157 x 10 308
(Max. Double)
0 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 0
1 00000000000 00000000000000000000000000000000000000000000000000002 ≙ -0
0 11111111111 00000000000000000000000000000000000000000000000000002 ≙ + ∞ (Pozitivní nekonečno)
1 11111111111 00000000000000000000000000000000000000000000000000002 ≙ -∞ (Záporné nekonečno)
0 11111111111 00000000000000000000000000000000000000000000000000012 ≙ NaN (SNaN u většiny procesorů, jako je x86 a ARM)
0 11111111111 10000000000000000000000000000000000000000000000000012 ≙ NaN (QNaN u většiny procesorů, jako je x86 a ARM)
0 11111111111 11111111111111111111111111111111111111111111111111112 ≙ NaN (Alternativa kódování)
0 01111111101 01010101010101010101010101010101010101010101010101012
= 3fd5 5555 5555 555516
≙ 2 -2 x (1 + 2 -2 + 2 -4 + ... + 2 -52 )
1 / 3
0 10000000000 10010010000111111011010101000100010000101101000110002
= 4009 21fb 5444 2d1816
≈ pi

Zakódování qNaN a sNaN nejsou zcela uvedeny v IEEE 754 a závisí na procesoru. Většina procesorů, jako je x86 rodinu a ARM rodinných procesorů, použijte nejvýznamnější bit mantisy pole pro indikaci klidné NaN; To je to, co se doporučuje IEEE 754. V PA-RISC procesory používají bit pro indikaci signalizace Nan.

Ve výchozím nastavení je 1 / 3 kola dolů, místo nahoru jako jediný přesnost , protože lichého počtu 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 provádění s dvojitou přesností aritmetiky

Používání dvojitou přesností proměnné s plovoucí desetinnou čárkou a matematické funkce (například sin, cos, atan2, log, exp a sqrt) jsou pomalejší než pracovat se svými jednotlivými přesné protějšky. Jednou z oblastí výpočetní techniky, kde se jedná o konkrétní problém je pro paralelní kód běžící na GPU. Například, při použití NVIDIA s CUDA platformu, výpočty s dvojitou přesností trvat přibližně 2 krát déle, v porovnání s těmi provedeno pomocí jediné přesnost .

implementace

Čtyřhra jsou implementovány v mnoha programovacích jazycích různými způsoby, jako je například následující. Procesory, které mají pouze dynamickou přesností, jako x86 bez SSE2 (nebo je-li SSE2 nepoužívá pro účely kompatibility) a s rozšířeným přesností použita jako výchozí, software může mít problémy splnit některé požadavky.

C a C ++

C a C ++ nabízí širokou škálu typů aritmetických . Double přesnost není nutné standardy (s výjimkou volitelného příloze F C99 , pokrývající IEEE 754 aritmetiku), ale na většině systémů doubletypu odpovídá dvojité přesnosti. Nicméně, na 32-bit x86 s rozšířenou přesnost ve výchozím nastavení, některé kompilátory nemusí být v souladu s normou C a / nebo aritmetický může trpět dvojité zaoblení .

Common Lisp

Common Lisp poskytuje typy SHORT-float, JEDNOHO plavení, DOUBLE-float a LONG-float. Většina implementací poskytne single-plave a dvakrát se vznáší s ostatními typy vhodná synonyma. Common Lisp stanoví výjimky pro chytání s plovoucí desetinnou čárkou podtečení a přetečení a nepřesnou výjimku s plovoucí desetinnou čárkou, podle IEEE 754. Žádné nekonečna a NaN jsou popsány v normě ANSI však několik implementací poskytují tyto jako rozšíření.

JavaScript

Jak je stanoveno v ECMAScript standardu, to vše aritmetika v JavaScriptu musí být provedeno pomocí dvojitou přesností s plovoucí řádovou čárkou.

viz též

  • IEEE 754 , standard IEEE pro plovoucí desetinnou čárkou aritmetiky

Poznámky a reference