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ě:
skutečná hodnota předpokládá, že daný 64-bit double-precision vztažný bod s danou neobjektivní exponent e {\displaystyle 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}}
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}}
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 =000000000012 00116 =1: |
2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}} | (smallest exponent for normal numbers) | |
e =011111111112 3ff16 =1023: |
2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}} | (zero offset) | |
e =100000001012 40516 =1029: |
2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}} | ||
e =111111111102 7fe16 =2046: |
2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}} | (highest exponent) |
The exponents 00016
and 7ff16
have a special meaning:
-
000000000002
00016
is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); a -
111111111112
7ff16
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}}}
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}}}
EndiannessEdit
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