Double-precision floating-point format
Double-precision binary floating-point is een veel gebruikt formaat op PC ‘ s, vanwege het grotere bereik dan single-precision floating-point, ondanks de prestaties en bandbreedte kosten. Het is algemeen bekend gewoon als dubbel. De IEEE 754-standaard specificeert een binary64 met:
- Tekenbit: 1 bit
- Exponent: 11 bits
- Significand precision: 53 bits (52 expliciet opgeslagen)
het tekenbit bepaalt het teken van het getal (inclusief wanneer dit getal nul is, dat ondertekend is).
het exponentveld is een 11-bit geheel getal zonder teken van 0 tot 2047, in vooringenomen vorm: een exponentwaarde van 1023 vertegenwoordigt de werkelijke nul. Exponenten variëren van -1022 tot +1023 omdat exponenten van -1023 (alle 0s) en +1024 (alle 1s) zijn gereserveerd voor speciale nummers.
de 53-bit significand precision geeft een nauwkeurigheid van 15 tot 17 significante decimale cijfers (2-53 ≈ 1,11 × 10-16). Als een decimale tekenreeks met ten hoogste 15 significante cijfers wordt geconverteerd naar IEEE 754 dubbele precisieweergave en vervolgens wordt geconverteerd naar een decimale tekenreeks met hetzelfde aantal cijfers, moet het eindresultaat overeenkomen met de oorspronkelijke tekenreeks. Als een IEEE 754-getal met dubbele precisie wordt geconverteerd naar een decimale tekenreeks met ten minste 17 significante cijfers en vervolgens wordt geconverteerd naar een weergave met dubbele precisie, moet het eindresultaat overeenkomen met het oorspronkelijke nummer.
het formaat is geschreven met de significand met een impliciet geheel getal van waarde 1 (behalve voor speciale gegevens, Zie de exponent-codering hieronder). Met de 52 bits van de breuk (F) significand in het geheugenformaat, is de totale precisie dus 53 bits (ongeveer 16 decimale cijfers, 53 log10(2) ≈ 15.955). De bits zijn als volgt ingedeeld:
de reële waarde die wordt aangenomen door een gegeven 64-bit double-precision datum met een gegeven vooringenomen exponent e {\displaystyle e}
en een 52-bit breuk is ( − 1 ) Teken ( 1. b 51 B 50. . . b 0) 2 × 2 e − 1023 {\displaystyle (-1)^{\text{sign}} (1.b_{51}b_{50}…b_{0})_{2}\times 2^{e-1023}}
of
( − 1 ) teken ( 1 + ∑ i = 1 52 b-52 − i 2 − i ) × 2 e − 1023 {\displaystyle (-1)^{\text{teken}}\left(1+\som _{i=1}^{52}b_{52-i}2^{-i}\right)\times 2^{e-1023}}
Tussen 252=4,503,599,627,370,496 en 253=9,007,199,254,740,992 de weergegeven getallen zijn precies de gehele getallen. Voor het volgende bereik, van 253 tot 254, wordt alles vermenigvuldigd met 2, dus de representeerbare getallen zijn de even, enz. Omgekeerd, voor het vorige bereik van 251 tot 252, is de afstand 0,5, enz.
de spatiëring als een fractie van de getallen in het bereik van 2n tot 2n+1 is 2n−52.De maximale relatieve afrondingsfout bij het afronden van een getal op het dichtstbijzijnde representatieve getal (de machine epsilon) is dus 2-53.
de 11 bit breedte van de exponent maakt de weergave van getallen tussen 10-308 en 10308 mogelijk, met volledige precisie van 15-17 decimale cijfers. Door de precisie in gevaar te brengen, maakt de subnormale representatie nog kleinere waarden mogelijk tot ongeveer 5 × 10-324.
Exponent encodingEdit
De dubbele precisie binaire floating-point exponent wordt gecodeerd met behulp van een offset-binaire representatie, met de nul offset is 1023; ook bekend als exponent bias in de IEEE 754 standaard. Voorbeelden van dergelijke representaties zijn:
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); en -
111111111112
7ff16
wordt gebruikt om ∞ (als F = 0) en NaNs (als F ≠ 0) weer te geven,
waarbij F het fractionele deel van de significand is. Alle bit patronen zijn geldige codering.
behalve de bovenstaande uitzonderingen wordt het volledige dubbele precisie-getal beschreven door:
( − 1 ) Teken × 2 e − 1023 × 1. breuk {\displaystyle (-1)^{\text{sign}}\times 2^{e-1023} \ times 1.{\text{fraction}}}
in het geval van subnormalen (e = 0 ) wordt het dubbele precisie getal beschreven door:
(- 1) Teken × 2 1 − 1023 × 0. breuk = (- 1 ) Teken × 2-1022 × 0. breuk {\displaystyle (-1)^{\text{sign}}\times 2^{1-1023} \ times 0.{\text{fraction}}=(-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{fraction}}}
EndiannessEdit
double-precision examplesEdit
0 01111111111 00000000000000000000000000000000000000000000000000002
3 3FF0 0000 0000 000016 ≙ +20 × 1 = 1
0 01111111111 00000000000000000000000000000000000000000000000000012
3 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
7 7FFF FFFF FFFF ffff FFFF16 ≙ NaN (een alternatieve codering van 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
coderingen van qNaN en sNaN zijn niet volledig gespecificeerd in IEEE 754 en zijn afhankelijk van de processor. De meeste processors, zoals de x86-familie en de ARM-familie processors, gebruiken het belangrijkste deel van het significand-veld om een stille NaN aan te geven; dit wordt aanbevolen door IEEE 754. De PA-RISC processors gebruiken de bit om een Nan aan te geven.
standaard rondt 1/3 af, in plaats van omhoog als enkele precisie, vanwege het oneven aantal bits in de significand.
In meer detail:
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
uitvoeringssnelheid met dubbele precisie rekenkundige bewerking
met behulp van drijvende-kommavariabelen met dubbele precisie en wiskundige functies (bijv. sin, cos, atan2, log, exp en sqrt) zijn langzamer dan werken met hun enkelvoudige precisie tegenhangers. Een gebied van computing waar dit een bepaald probleem is, is parallelle code die op GPU ‘ s draait. Bijvoorbeeld, bij het gebruik van NVIDIA ‘ s CUDA platform, berekeningen met dubbele precisie nemen, afhankelijk van een hardware, ongeveer 2 tot 32 keer zo lang te voltooien in vergelijking met die gedaan met behulp van enkele precisie.
Precisiebeperkingen op gehele waardenedit
- gehele getallen van -253 tot 253 (-9007199254740992 tot 9007199254740992) kan exact worden weergegeven
- gehele getallen tussen 253 en 254 = 18014398509481984 ronde tot een veelvoud van 2 (even getal)
- gehele getallen tussen 254 en 255 = 36028797018963968 ronde tot een veelvoud van 4