Articles

Double-precision floating-point formátu

Double-precision binární floating-point je běžně používaný formát na Pc, vzhledem k jeho širší rozsah, v single-precision floating point, navzdory jeho výkon a šířku pásma náklady. To je obyčejně známé jednoduše jako double. IEEE 754 standard určuje binary64 jako že:

  • znaménkový bit: 1 bit
  • Exponent: 11 bitů
  • Significand přesnost: 53 bitů (52 explicitně uložena)

znaménkový bit určuje znaménko čísla (včetně toho, pokud je toto číslo nula, které je podepsané).

pole exponentu je 11bitové nepodepsané celé číslo od 0 do 2047, v zkreslené podobě: hodnota exponentu 1023 představuje skutečnou nulu. Exponenty se pohybují od -1022 do +1023, protože exponenty -1023 (všechny 0s) a +1024 (všechny 1s) jsou vyhrazeny pro speciální čísla.

53-bit significand přesnost dává 15 až 17 významné desetinné číslice přesnost (2-53 ≈ 1,11 × 10-16). Pokud je desetinný řetězec s nejvýše 15 významnými číslicemi převeden na IEEE 754 s dvojitou přesností 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 nejméně 17 významnými číslicemi a poté převedeno zpět na reprezentaci s dvojitou přesností, musí konečný výsledek odpovídat původnímu číslu.

formát se zapisuje s významem, který má implicitní celočíselný bit hodnoty 1 (s výjimkou speciálních dat viz kódování exponentu níže). S 52 bitů frakce (F) significand objevují v paměti formát, celková přesnost je tedy 53 bitů (přibližně 16 desetinných míst, 53 log10(2) ≈ 15.955). Bity jsou rozloženy následovně:

formát IEEE 754 s dvojitou desetinnou čárkou.svg

skutečná hodnota předpokládá, že daný 64-bit double-precision vztažný bod s danou neobjektivní exponent e {\displaystyle e}

e

a 52-bit frakce je ( − 1 ) znamení ( 1. b 51 b 50 . . . b 0) 2 × 2 e-1023 {\displaystyle (-1)^{\text{sign}}(1.B_{51}b_{50}…b_{0})_{2} \ krát 2^{e-1023}}

(-1)^{\text{sign}} (1.B_{51}b_{50}...b_{0})_{2}\times 2^{e-1023}

nebo

( − 1 ) sign ( 1 + ∑ i = 1 52 b 52 − i 2 − i) x 2 e − 1023 {\displaystyle (-1)^{\text{znak}}\left(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\right)\times 2^{e-1023}}

(-1)^{\text{znak}}\left(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\right)\times 2^{e-1023}

Mezi 252=4,503,599,627,370,496 a 253=9,007,199,254,740,992 je reprezentovat čísla jsou přesně na celá čísla. Pro další rozsah, od 253 do 254, je vše vynásobeno 2, takže reprezentovatelná čísla jsou sudá, atd. Naopak pro předchozí rozsah od 251 do 252 je rozestup 0,5 atd.

rozteč jako zlomek čísel v rozmezí od 2n do 2n+1 je 2n-52.Maximální relativní chyba zaokrouhlování při zaokrouhlování čísla na nejbližší reprezentativní číslo (stroj epsilon) je tedy 2-53.

Šířka 11 bitů exponentu umožňuje reprezentaci čísel mezi 10-308 a 10308, s přesností 15-17 desetinných číslic. Snížením přesnosti umožňuje subnormální reprezentace ještě menší hodnoty až do velikosti 5 × 10-324.

Exponent encodingEdit

double-precision binární floating-point exponent je kódován pomocí offset-binární reprezentace, s zero offset, že 1023; také známý jako exponent bias v IEEE 754 standard. Příklady takových prohlášení by bylo:

e =00000000001200116=1: 2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}}

{\displaystyle 2^{1-1023}=2^{-1022}}
(smallest exponent for normal numbers)
e =0111111111123ff16=1023: 2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}}

{\displaystyle 2^{1023-1023}=2^{0}}
(zero offset)
e =10000000101240516=1029: 2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}}

{\displaystyle 2^{1029-1023}=2^{6}}
e =1111111111027fe16=2046: 2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}}

{\displaystyle 2^{2046-1023}=2^{1023}}
(highest exponent)

The exponents 00016 and 7ff16 have a special meaning:

  • 00000000000200016 is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); a
  • 1111111111127ff16 se používá k reprezentaci ∞ (pokud F = 0) a Babičky (pokud F ≠ 0),

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

až na výše uvedené výjimky je celé číslo s dvojitou přesností popsáno znaménkem

(- 1) × 2 e-1023 × 1. frakce {\displaystyle (-1)^{\text{sign}} \ krát 2^{e-1023}\krát 1.{\text{fraction}}}

{\displaystyle (-1)^{\text{sign}} \ krát 2^{e-1023}\krát 1.{\text{frakce}}}

V případě podnormálů (e = 0) je číslo s dvojitou přesností popsáno znaménkem

(−1) × 2 1-1023 × 0. frakce = (- 1 ) znak × 2-1022 × 0. frakce {\displaystyle (-1)^{\text{sign}}\krát 2^{1-1023}\krát 0.{\text{fraction}}=(-1)^{\text{sign}}\krát 2^{-1022}\krát 0.{\text{zlomek}}}

{\displaystyle (-1)^{\text{znak}}\times 2^{1-1023}\krát 0.{\text{fraction}}=(-1)^{\text{sign}}\krát 2^{-1022}\krát 0.{\text{zlomek}}}

EndiannessEdit

Tato část je výňatek z Endian § Plovoucí desetinnou čárkou
i když všudypřítomné x86 procesory dnes používá little-endian úložiště pro všechny typy dat (integer, floating point), existuje řada hardwarových architektur, kde čísla s plovoucí desetinnou čárkou jsou zastoupeny v big-endian formě, zatímco celá čísla jsou zastoupeny v little-endian formě. Existují procesory ARM, které mají napůl malý endian, napůl big-endian s plovoucí desetinnou čárkou pro čísla s dvojitou přesností: obě 32bitová slova jsou uložena v little-endian jako celočíselné registry, ale nejvýznamnější nejprve. Protože existuje mnoho formátů s plovoucí desetinnou čárkou bez standardní reprezentace „sítě“, standard XDR používá jako reprezentaci big-endian IEEE 754. Může se tedy zdát divné, že rozšířený standard IEEE 754 s plovoucí desetinnou čárkou neurčuje endianitu. Teoreticky to znamená, že ani standardní data IEEE s plovoucí desetinnou čárkou zapsaná jedním strojem nemusí být čitelná jiným strojem. Na moderních standardních počítačích (tj. prováděcí IEEE 754), lze v praxi bezpečně předpokládat, že endian je stejný pro čísla s plovoucí desetinnou čárkou jako pro celá čísla, takže konverze jednoduché, bez ohledu na datový typ. (Malé vestavěné systémy používající speciální formáty s plovoucí desetinnou čárkou však mohou být jinou záležitostí.)

Double-precision examplesEdit

0 01111111111 00000000000000000000000000000000000000000000000000002 ≙ 3FF0 0000 0000 000016 ≙ +20 × 1 = 1

0 01111111111 00000000000000000000000000000000000000000000000000012 ≙ 3FF0 0000 0000 000116 ≙ +20 × (1 + 2-52) ≈ 1.0000000000000002, the smallest number > 1

0 01111111111 00000000000000000000000000000000000000000000000000102 ≙ 3FF0 0000 0000 000216 ≙ +20 × (1 + 2−51) ≈ 1.0000000000000004

0 10000000000 00000000000000000000000000000000000000000000000000002 ≙ 4000 0000 0000 000016 ≙ +21 × 1 = 2

1 10000000000 00000000000000000000000000000000000000000000000000002 ≙ C000 0000 0000 000016 ≙ −21 × 1 = −2

0 10000000000 10000000000000000000000000000000000000000000000000002 ≙ 4008 0000 0000 000016 ≙ +21 × 1.12 = 112 = 3

0 10000000001 00000000000000000000000000000000000000000000000000002 ≙ 4010 0000 0000 000016 ≙ +22 × 1 = 1002 = 4

0 10000000001 01000000000000000000000000000000000000000000000000002 ≙ 4014 0000 0000 000016 ≙ +22 × 1.012 = 1012 = 5

0 10000000001 10000000000000000000000000000000000000000000000000002 ≙ 4018 0000 0000 000016 ≙ +22 × 1.12 = 1102 = 6

0 10000000011 01110000000000000000000000000000000000000000000000002 ≙ 4037 0000 0000 000016 ≙ +24 × 1.01112 = 101112 = 23

0 01111111000 10000000000000000000000000000000000000000000000000002 ≙ 3F88 0000 0000 000016 ≙ +2−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)

0 00000000000 00000000000000000000000000000000000000000000000000012 ≙ 0000 0000 0000 000116 ≙ +2−1022 × 2−52 = 2−1074
≈ 4.9406564584124654 × 10−324 (Min. subnormal positive double)

0 00000000000 11111111111111111111111111111111111111111111111111112 ≙ 000F FFFF FFFF FFFF16 ≙ +2−1022 × (1 − 2−52)
≈ 2.2250738585072009 × 10−308 (Max. subnormal double)

0 00000000001 00000000000000000000000000000000000000000000000000002 ≙ 0010 0000 0000 000016 ≙ +2−1022 × 1
≈ 2.2250738585072014 × 10−308 (Min. normal positive double)

0 11111111110 11111111111111111111111111111111111111111111111111112 ≙ 7FEF FFFF FFFF FFFF16 ≙ +21023 × (1 + (1 − 2−52))
≈ 1.7976931348623157 × 10308 (Max. Double)

0 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 0000 0000 0000 000016 ≙ +0

1 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 8000 0000 0000 000016 ≙ −0

0 11111111111 00000000000000000000000000000000000000000000000000002 ≙ 7FF0 0000 0000 000016 ≙ +∞ (positive infinity)

1 11111111111 00000000000000000000000000000000000000000000000000002 ≙ FFF0 0000 0000 000016 ≙ −∞ (negative infinity)

0 11111111111 00000000000000000000000000000000000000000000000000012 ≙ 7FF0 0000 0000 000116 ≙ NaN (sNaN on most processors, such as x86 and ARM)

0 11111111111 10000000000000000000000000000000000000000000000000012 ≙ 7FF8 0000 0000 000116 ≙ NaN (qNaN on most processors, such as x86 and ARM)

0 11111111111 11111111111111111111111111111111111111111111111111112 ≙ 7FFF FFFF FFFF FFFF16 ≙ NaN (alternativní kódování NaN)

0 01111111101 01010101010101010101010101010101010101010101010101012 = 3FD5 5555 5555 555516 ≙ +2-2 × (1 + 2-2 + 2-4 + … + 2-52) ≈ 1/3

0 10000000000 10010010000111111011010101000100010000101101000110002 = 4009 21FB 5444 2D1816 ≈ pi

Kódování qNaN a sNaN jsou ne zcela specifikovaný v IEEE 754 a závisí na procesoru. Většina procesorů, jako jsou rodiny x86 a ARM rodiny procesorů, použití nejvíce významný bit z significand pole pro označení, tichý NaN; to je to, co je doporučeno podle IEEE 754. Procesory PA-RISC používají bit k označení signalizačního NaN.

ve výchozím nastavení, 1/3 kola dolů, místo nahoru jako jediný přesnost, protože lichý počet bitů v significand.

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 dvojitou přesností arithmeticEdit

Použití double-precision floating-point proměnnými a matematických funkcí (např. sin, cos, atan2, log, exp, sqrt) jsou pomalejší, než pracovat s jejich single precision protějšky. 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 CUDA platformy, výpočty s dvojitou přesností trvat, v závislosti na hardware, přibližně 2 až 32 krát tak dlouho, aby dokončit ve srovnání s těmi provádí pomocí single precision.

Přesné omezení na celé číslo valuesEdit

  • pro Celá čísla od -253 až 253 (-9007199254740992 do 9007199254740992) mohou být přesně zastoupeny
  • Celá čísla mezi 253 a 254 = 18014398509481984 kolo na násobek 2 (sudé číslo)
  • Celá čísla mezi 254 a 255 = 36028797018963968 kolo na násobek 4

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *