Articles

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:

IEEE 754 Double Floating Point Format.svg

de reële waarde die wordt aangenomen door een gegeven 64-bit double-precision datum met een gegeven vooringenomen exponent e {\displaystyle e}

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}}

(-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}}

(-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 = 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); en
  • 1111111111127ff16 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}}}

{\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}}}

{\displaystyle (-1)^{\text{sign}}\times 2^{1-1023}\times 0.{\text{fraction}}=(-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{fraction}}}

EndiannessEdit

deze sectie is een uittreksel uit endianness § Floating point
hoewel de alomtegenwoordige x86-processors van vandaag weinig-endian-opslag gebruiken voor alle soorten data (integer, floating point), zijn er een aantal hardware-architecturen waar floating-point getallen in big-endian-vorm worden weergegeven, terwijl gehele getallen worden weergegeven in little-endian vorm. Er zijn ARM-processors die half little-endian, half big-endian floating-point representatie hebben voor dubbele precisienummers: beide 32-bit woorden worden opgeslagen in Little-endian-achtige integer registers, maar de belangrijkste eerst. Omdat er veel floating-point formaten zijn geweest zonder “netwerk” standaard representatie voor hen, gebruikt de XDR standaard big-endian IEEE 754 als zijn representatie. Het kan daarom vreemd lijken dat de wijdverbreide IEEE 754 floating-point standaard geen endianness specificeert. Theoretisch betekent dit dat zelfs standaard IEEE floating-point data geschreven door een machine misschien niet leesbaar zijn door een andere. Echter, op moderne standaard computers (d.w.z., implementatie van IEEE 754), kan men in de praktijk veilig aannemen dat de endianness hetzelfde is voor floating-point getallen als voor gehele getallen, waardoor de conversie eenvoudig is ongeacht het gegevenstype. (Kleine embedded systemen die gebruik maken van speciale floating-point formaten kan echter een andere zaak zijn.)

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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *