Articles

Dobbeltpræcisions flydende punktformat

dobbeltpræcisions binært flydende punkt er et almindeligt anvendt format på pc ‘ er på grund af dets bredere rækkevidde over enkeltpræcisions flydende punkt på trods af dets ydeevne og båndbreddeomkostninger. Det er almindeligt kendt simpelthen som dobbelt. IEEE 754-standarden specificerer en binary64 som havende:

  • Sign bit: 1 bit
  • eksponent: 11 bit
  • Significand precision: 53 bit (52 eksplicit gemt)

sign bit bestemmer tegnet på nummeret (inklusive når dette tal er nul, som er underskrevet).

eksponentfeltet er et 11-bit usigneret heltal fra 0 til 2047 i partisk form: en eksponentværdi på 1023 repræsenterer det faktiske nul. Eksponenter spænder fra -1022 til +1023, fordi eksponenter for -1023 (alle 0 ‘er) og +1024 (alle 1’ er) er forbeholdt specielle numre.

53-bit significand precision giver fra 15 til 17 signifikante decimalcifre præcision (2-53 liter 1,11 liter 10-16). Hvis en decimalstreng med højst 15 signifikante cifre konverteres til IEEE 754 dobbeltpræcisionsrepræsentation og derefter konverteres tilbage til en decimalstreng med det samme antal cifre, skal det endelige resultat matche den originale streng. Hvis et IEEE 754 dobbeltpræcisionsnummer konverteres til en decimalstreng med mindst 17 signifikante cifre og derefter konverteres tilbage til dobbeltpræcisionsrepræsentation, skal det endelige resultat svare til det oprindelige tal.

formatet er skrevet med signifikantog har en implicit heltal bit af værdi 1 (undtagen særlige data, se eksponentkodningen nedenfor). Med de 52 bit af fraktionen (F) significand, der vises i hukommelsesformatet, er den samlede præcision derfor 53 bit(cirka 16 decimaler, 53 log10 (2) til 15.955). Bitene er lagt ud som følger:

IEEE 754 Dobbelt Floating Point Format.svg

den reelle værdi antaget af et givet 64-bit dobbeltpræcisionsdatum med en given partisk eksponent e {\displaystyle e}

e

og en 52-bit fraktion er ( − 1 ) Tegn ( 1. b 51 b 50 . . . b 0) 2 ret 2 e-1023 {\displaystyle (-1)^{\tekst{tegn}}(1.b_{51}b_{50}…b_{0})_{2}\gange 2^{e-1023}}

(-1)^{\tekst{tegn}}(1.b_{51}b_{50}...b_{0})_{2}\gange 2^{e-1023}

eller

( − 1 ) Tegn ( 1 + list i = 1 52 b 52 − i 2 − i) List 2 e − 1023 {\displaystyle (-1)^{\tekst{sign}}\venstre(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\højre)\gange 2^{e-1023}}

(-1)^{\tekst{tegn}}\venstre(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\højre)\gange 2^{e-1023}

mellem 252=4.503.599.627.370.496 og 253=9.007.199.254.740.992 de repræsentative tal er nøjagtigt heltalene. For det næste interval, fra 253 til 254, multipliceres alt med 2, så de repræsentative tal er de lige osv. Omvendt er afstanden for det foregående interval fra 251 til 252 0,5 osv.

afstanden som en brøkdel af tallene i området fra 2n til 2n+1 er 2n−52.Den maksimale relative afrundingsfejl ved afrunding af et tal til den nærmeste repræsentative (maskinen epsilon) er derfor 2-53.

eksponentens 11 bitbredde tillader repræsentation af tal mellem 10-308 og 10308 med fuld præcision på 15-17 decimaler. Ved at gå på kompromis med præcision, den subnormale repræsentation tillader endnu mindre værdier op til omkring 5 liter 10-324.

eksponent encodingEdit

den dobbelte præcision binære flydende punkt eksponent er kodet ved hjælp af en offset-binær repræsentation, hvor nulforskydningen er 1023; også kendt som eksponent bias i IEEE 754 standard. Eksempler på sådanne repræsentationer ville være:

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); og
  • 1111111111127ff16 bruges til at repræsentere Larv (hvis F = 0) og NaNs (hvis f-0),

hvor F er den delvise del af signifikanden. Alle bitmønstre er gyldige kodning.

Med undtagelse af ovenstående undtagelser er hele dobbeltpræcisionsnummeret beskrevet af:

( − 1 ) tegn på 2 e − 1023 på 1. fraktion {\displaystyle (-1)^{\tekst{tegn}}\gange 2^{e-1023}\gange 1.{\tekst{fraktion}}}

{\displaystyle (-1)^{\tekst{tegn}}\gange 2^{e-1023}\gange 1.{\tekst{fraktion}}}

i tilfælde af subnormaler (e = 0) er dobbeltpræcisionsnummeret beskrevet af:

(- 1 ) tegn på 2 1 − 1023 − 0. fraktion = (−1 ) sign lot 2-1022 lot 0. fraktion {\displaystyle (-1)^{\tekst{tegn}}\gange 2^{1-1023}\gange 0.{\tekst{fraktion}}=(-1)^{\tekst{tegn}}\gange 2^{-1022}\gange 0.{\tekst{fraktion}}}

{\displaystyle (-1)^{\tekst{tegn}}\gange 2^{1-1023}\gange 0.{\tekst{fraktion}}=(-1)^{\tekst{tegn}}\gange 2^{-1022}\gange 0.{\text{brøkdel}}}

EndiannessEdit

Dette afsnit er et uddrag fra Endethed § Flydende punkt
Selvom den allestedsnærværende x86-processorer i dag bruger little-endian opbevaring til alle typer af data (heltal, kommatal), der er en række hardware-arkitekturer, hvor flydende tal er repræsenteret i big-endian form, mens hele tal, der er repræsenteret i little-endian form. Der er ARM-processorer, der har halv lille endian, halv big-endian floating-point repræsentation for dobbelt præcision tal: begge 32-bit ord gemmes i little-endian ligesom heltal registre, men den mest betydningsfulde først. Fordi der har været mange flydende punktsformater uden nogen “netværks” standardrepræsentation for dem, bruger den store endian IEEE 754 som sin repræsentation. Det kan derfor virke underligt, at den udbredte IEEE 754 floating-point standard ikke angiver endianness. Teoretisk betyder det, at selv standard IEEE-flydende punktdata skrevet af en maskine muligvis ikke kan læses af en anden. Men på moderne standardcomputere (dvs., implementering af IEEE 754), kan man i praksis sikkert antage, at endianness er den samme for flydende punktnumre som for heltal, hvilket gør konverteringen ligetil uanset datatype. (Små indlejrede systemer, der bruger specielle flydende punktformater, kan dog være en anden sag.)

dobbeltpræcisionseksemplerrediger

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

0 01111111111 00000000000000000000000000000000000000000000000000012 kr3ff0 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 prist 7fff FFFF FFFF FFFF16 prist NaN (en alternativ kodning af NaN)

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

0 10000000000 10010010000111111011010101000100010000101101000110002 = 4009 21fb 5444 2d1816 ren pi

kodninger af knan og sNaN er ikke fuldstændigt specificeret i IEEE 754 og afhænger af processoren. 86 – familien og ARM-familieprocessorerne bruger den mest betydningsfulde bit af significand-feltet til at indikere en stille NaN; dette anbefales af IEEE 754. PA-RISC-processorer bruger biten til at indikere en signalering NaN.

som standard 1/3 runder ned, i stedet for op som enkelt præcision, på grund af det ulige antal bits i significand.

mere detaljeret:

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

eksekveringshastighed med dobbeltpræcision aritmeticedit

brug af dobbeltpræcisions flydende punktvariabler og matematiske funktioner (f.eks. Et område af computing, hvor dette er et bestemt problem, er parallel kode, der kører på GPU ‘ er. For eksempel, når du bruger Nvidias CUDA-platform, tager beregninger med dobbelt præcision, afhængigt af et udstyr, cirka 2 til 32 gange så lang tid at gennemføre sammenlignet med dem, der udføres ved hjælp af enkelt præcision.

Præcisionsbegrænsninger på heltalsværdierredit

  • heltal fra -253 til 253 (-9007199254740992 til 9007199254740992) kan nøjagtigt repræsenteres
  • heltal mellem 253 og 254 = 18014398509481984 runde til et multiplum af 2 (lige tal)
  • heltal mellem 254 og 255 = 36028797018963968 runde til et multiplum af 4

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *