Articles

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:

Ieee 754 Dobbelt Flytende Punktformat.svg

den reelle verdien antatt av et gitt 64-biters dobbeltpresisjonsdatum med en gitt partisk eksponent e {\displaystyle e}

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

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

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

{\displaystyle (-1)^{\text{sign}}\ganger 2^{e-1023} \ ganger 1.{\text{fraction}}}

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

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

EndiannessEdit

Denne delen Er et utdrag Fra Endianness § Flytende punkt
Selv om de allestedsnærværende x86-prosessorene i dag bruker lite endian-lagring for alle typer data (heltall, flytende punkt), er det en rekke maskinvarearkitekturer hvor flytende punktnumre er representert i storendian form mens heltall er representert.representert i liten endisk form. DET ER ARM-prosessorer som har halv liten endian, halv stor endian flytende punktrepresentasjon for dobbeltpresisjonsnumre: begge 32-biters ord lagres i lite endian som heltallsregistre, men den viktigste først. FORDI DET har vært mange flytende punktformater uten «nettverk» standard representasjon for DEM, BRUKER XDR-standarden big-endian ieee 754 som representasjon. Det kan derfor virke rart at den utbredte ieee 754 flyttallsstandarden ikke angir endianness. Teoretisk betyr dette at selv standard ieee flytende punktdata skrevet av en maskin kanskje ikke kan leses av en annen. Men på moderne standard datamaskiner (dvs., implementere ieee 754), kan man i praksis trygt anta at endianness er den samme for flyttall som for heltall, noe som gjør konverteringen grei uavhengig av datatype. (Små innebygde systemer ved hjelp av spesielle flyttall formater kan være en annen sak, men .)

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *