Dobbelt presisjon flyttallsformat
dobbelt presisjon binær flyttallsformat Er et vanlig brukt format På Pcer, på grunn av sitt bredere spekter over single-presisjon flyttallsformat, til tross for ytelsen og båndbreddekostnaden. Det er vanligvis kjent som dobbelt. Ieee 754-standarden spesifiserer en binary64 som å ha:
- Sign bit: 1 bit
- Eksponent: 11 bits
- Significand precision: 53 bits (52 eksplisitt lagret)
sign bit bestemmer tegn på tallet (inkludert når dette tallet er null, som er signert).eksponentfeltet er et 11-biters usignert heltall fra 0 til 2047, i partisk form: en eksponentverdi på 1023 representerer den faktiske null. Eksponenter varierer fra -1022 til + 1023 fordi eksponenter på -1023 (alle 0s) og +1024 (alle 1s) er reservert for spesielle tall.
den 53-biters significand precision gir fra 15 til 17 signifikante desimaltall presisjon (2-53 ≈ 1.11 × 10-16). Hvis en desimalstreng med maksimalt 15 signifikante sifre konverteres til ieee 754 dobbel presisjonsrepresentasjon, og deretter konverteres tilbake til en desimalstreng med samme antall sifre, bør sluttresultatet samsvare med den opprinnelige strengen. Hvis et ieee 754-tall med dobbel presisjon konverteres til en desimalstreng med minst 17 signifikante sifre, og deretter konverteres tilbake til dobbel presisjonsrepresentasjon, må sluttresultatet samsvare med det opprinnelige tallet.
formatet er skrevet med significand har en implisitt heltall bit av verdi 1 (unntatt spesielle data, se eksponent koding nedenfor). Med 52 biter av fraksjonen (F) significand som vises i minneformatet, er den totale presisjonen derfor 53 biter(omtrent 16 desimaler, 53 log10 (2) ≈ 15.955). Bitene er lagt ut som følger:
den reelle verdien antatt av et gitt 64-biters dobbeltpresisjonsdatum med en gitt partisk eksponent e {\displaystyle e}
og en 52-biters fraksjon er ( − 1 ) tegn ( 1. b 51 b 50 . . . b 0) 2 × 2 e − 1023 {\displaystyle (-1)^{\text{sign}} (1.b_{51} b_{50}…b_{0})_{2} \ ganger 2^{e-1023}}
eller
( − 1 ) tegn ( 1 + ∑ i = 1 52 b 52 − i 2 − i ) × 2 e − 1023 {\displaystyle (-1)^{\text{sign}}\venstre(1+\sum _{i=1}^{52}b_{52-i}2^{-i}\høyre)\ganger 2^{e-1023}}
mellom 252=4,503,599,627,370,496 og 253=9,007,199,254,740,992 de representable tallene er nøyaktig heltallene. For neste rekkevidde, fra 253 til 254, blir alt multiplisert med 2, så de representable tallene er de jevne, etc. Omvendt, for det forrige området fra 251 til 252, er avstanden 0,5, etc.
avstanden som en brøkdel av tallene i området fra 2n til 2n+1 er 2n-52.Den maksimale relative avrundingsfeilen ved avrunding av et tall til nærmeste representable (maskinen epsilon) er derfor 2-53.
eksponentens 11 bit bredde tillater representasjon av tall mellom 10-308 og 10308, med full 15-17 desimaltall presisjon. Ved å kompromittere presisjonen tillater den subnormale representasjonen enda mindre verdier opp til ca 5 × 10-324.
Eksponentkodingedit
dobbel presisjon binær flyttall eksponenten er kodet ved hjelp av en offset-binær representasjon, med null offset være 1023; også kjent som eksponent bias i IEEE 754 standard. Eksempler på slike representasjoner vil være:
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); og -
111111111112
7ff16
brukes til å representere ∞ (Hvis F = 0) og NaNs (Hvis F ≠ 0),
Hvor F er den fraksjonelle delen av significand. Alle bitmønstre er gyldig koding.
med Unntak av unntakene ovenfor, er hele dobbeltpresisjonsnummeret beskrevet med:
(−1 ) tegn × 2 e-1023 × 1. fraksjon {\displaystyle (-1)^{\text{sign}} \ ganger 2^{e-1023} \ ganger 1.{\text{fraksjon}}}
i tilfelle av undernormaler (e = 0) er dobbeltpresisjonstallet beskrevet av:
(- 1 ) tegn × 2 1 − 1023 × 0. fraksjon = (- 1) sign × 2 – 1022 × 0. fraksjon {\displaystyle (-1)^{\text{sign}}\ganger 2^{1-1023}\ganger 0.{\text{fraksjon}}=(-1)^{\text{sign}}\ganger 2^{-1022}\ganger 0.{\text{fraksjon}}}
EndiannessEdit
dobbel presisjon eksemplerrediger
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 (en alternativ koding Av 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
Kodinger av qNaN og sNaN er ikke fullstendig spesifisert i ieee 754 og avhenger av prosessoren. De fleste prosessorer, som x86-familien og ARM-familieprosessorene, bruker den viktigste delen av significand-feltet for å indikere en stille NaN; DETTE er det som anbefales av ieee 754. PA-RISC-prosessorene bruker biten til å indikere en signalering NaN.
som standard runder 1/3 ned, i stedet for opp som enkelt presisjon, på grunn av det odde antall biter i significand.
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
Utførelseshastighet med dobbel presisjon arithmeticEdit
ved hjelp av flytende punktvariabler med dobbel presisjon og matematiske funksjoner (f.eks. sin, cos, atan2, log, exp og sqrt) er tregere enn å jobbe med sine enkeltpresisjonsmodeller. Et område med databehandling der dette er et bestemt problem, er parallell kode som kjører På Gpuer. For eksempel, når DU bruker NVIDIAS CUDA-plattform, tar beregninger med dobbel presisjon, avhengig av maskinvare, omtrent 2 til 32 ganger så lang tid å fullføre i forhold til de som er gjort ved hjelp av enkel presisjon.
Presisjonsbegrensninger på heltallverdierrediger
- Heltall fra -253 til 253 (-9007199254740992 til 9007199254740992) kan nøyaktig representeres
- Heltall mellom 253 og 254 = 18014398509481984 runde til et multiplum av 2 (partall)
- heltall mellom 254 og 255 = 36028797018963968 runde til et multiplum av 4