Articles

Dubbel precision flytpunkt format

dubbel precision binär flytpunkt är ett vanligt format på datorer, på grund av dess bredare utbud över enkel precision flytpunkt, trots dess prestanda och bandbredd kostnad. Det är allmänt känt helt enkelt som dubbelt. IEEE 754-standarden anger att en binary64 har:

  • Teckenbit: 1 bit
  • Exponent: 11 bitar
  • Significand precision: 53 bitar (52 uttryckligen lagrade)

teckenbiten bestämmer tecknet på numret (inklusive när detta nummer är noll, vilket är signerat).

exponentfältet är ett 11-bitars osignerat heltal från 0 till 2047, i partisk form: ett exponentvärde på 1023 representerar den faktiska noll. Exponenter sträcker sig från -1022 till +1023 eftersom exponenter på -1023 (alla 0s) och +1024 (alla 1s) är reserverade för specialnummer.

den 53-bitars signifikantprecisionen ger från 15 till 17 signifikanta decimalsiffror precision (2-53 1,11 10-16). Om en decimalsträng med högst 15 signifikanta siffror konverteras till IEEE 754 dubbel precision representation, och sedan konverteras tillbaka till en decimalsträng med samma antal siffror, bör slutresultatet matcha den ursprungliga strängen. Om ett IEEE 754 dubbelprecisionsnummer konverteras till en decimalsträng med minst 17 signifikanta siffror och sedan konverteras tillbaka till dubbelprecisionsrepresentation måste slutresultatet matcha det ursprungliga numret.

formatet är skrivet med signifikantoch har en implicit heltal bit av värde 1 (förutom specialdata, se exponentkodningen nedan). Med de 52 bitarna av fraktionen (F) signifikantoch som visas i minnesformatet är den totala precisionen därför 53 bitar (cirka 16 decimaler, 53 log10(2) 15,955 xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx xnumx). Bitarna läggs ut enligt följande:

IEEE 754 Dubbel Flyttalsformat.svg

det verkliga värdet antas av en given 64-bitars dubbel precision datum med en given partisk exponent e {\displaystyle E}

e

och en 52-bitars fraktion är ( − 1 ) tecken ( 1. b 51 b 50 . . . b 0) 2 c 2 e – 1023 {\displaystyle(-1)^{\text{sign}} (1.b_{51}b_{50}…b_{0}) _ {2} \ gånger 2^{e-1023}}

(-1)^{\text{sign}}(1.b_{51}b_{50}...b_{0})_{2}\gånger 2^{e-1023}

eller

( − 1 ) tecken ( 1 + C/i = 1 52 B 52 − i 2 − i) C/2 e − 1023 {\displaystyle (-1)^{\text{sign}}\vänster(1+\summa _{i=1}^{52}b_{52-i}2^{-i}\höger)\gånger 2^{e-1023}}

(-1)^{\text{sign}}\vänster(1+\summa _{i=1}^{52}b_{52-i}2^{-i}\höger)\gånger 2^{e-1023}

mellan 252=4,503,599,627,370,496 och 253=9,007,199,254,740,992 de representerbara siffrorna är exakt heltal. För nästa intervall, från 253 till 254, multipliceras allt med 2, så de representativa siffrorna är de jämna, etc. Omvänt, för föregående intervall från 251 till 252 är avståndet 0,5 etc.

avståndet som en bråkdel av siffrorna i intervallet från 2n till 2n+1 är 2n−52.Det maximala relativa avrundningsfelet vid avrundning av ett tal till närmaste representerbara (maskinen epsilon) är därför 2-53.

exponentens 11 bitbredd möjliggör representation av siffror mellan 10-308 och 10308, med full 15-17 decimalsiffror precision. Genom att kompromissa med precisionen tillåter den subnormala representationen ännu mindre värden upp till cirka 5 kub 10-324.

Exponent encodingEdit

dubbel precision binär flytande punkt exponent kodas med hjälp av en offset-binär representation, med noll offset är 1023; även känd som exponent bias i IEEE 754-standarden. Exempel på sådana representationer skulle vara:

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); och
  • 1111111111127ff16 används för att representera kub (om F = 0) och NaNs (om f 0 0),

där F är den fraktionella delen av signifikansen. Alla bitmönster är giltiga kodning.

förutom ovanstående undantag beskrivs hela dubbelprecisionsnumret med:

( − 1 ) tecken 2 e − 1023 1. fraktion {\displaystyle (-1)^{\text{tecken}}\gånger 2^{e-1023}\gånger 1.{\text{fraktion}}}

{\displaystyle (-1)^{\text{tecken}}\gånger 2^{e-1023}\gånger 1.{\text{fraction}}}

När det gäller subnormaler (e = 0) beskrivs dubbelprecisionsnumret med:

(- 1 ) tecken 2 1 − 1023 0. fraktion = (- 1) tecken 2 − 1022 0. fraktion {\displaystyle (-1)^{\text{sign}}\gånger 2^{1-1023}\gånger 0.{\text{fraction}}=(-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{fraktion}}}

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

EndiannessEdit

det här avsnittet är ett utdrag ur endianness Jacobs flytpunkt
även om de allestädes närvarande x86-processorerna i dag använder lite-endian-lagring för alla typer av data (heltal, flytpunkt), finns det ett antal hårdvaruarkitekturer där flytpunktsnummer representeras i stor-endian-form medan heltal representeras i stor-endian-form little-endian form. Det finns ARM-processorer som har halv liten-endian, halv stor-endian flytpunkt representation för dubbel precision nummer: båda 32-bitars ord lagras i little-endian som heltal register, men den viktigaste först. Eftersom det har funnits många flyttalsformat utan ”nätverk” standardrepresentation för dem, använder XDR-standarden big-endian IEEE 754 som sin representation. Det kan därför verka konstigt att den utbredda IEEE 754 flytpunktsstandarden inte anger endianness. Teoretiskt innebär detta att även standard IEEE-flytpunktsdata skrivna av en maskin kanske inte kan läsas av en annan. Men på moderna standarddatorer (dvs., genomförande av IEEE 754) kan man i praktiken säkert anta att endiannessen är densamma för flytpunktsnummer som för heltal, vilket gör konverteringen enkel oavsett datatyp. (Små inbyggda system som använder speciella flyttalsformat kan dock vara en annan sak.)

dubbel precision examplesEdit

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 111111111111111111111111111111111111111111111111111127fff ffff ffff 16 Nan (en alternativ kodning av NaN)

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

0 10000000000 10010010000111111011010101000100010000101101000110002 = 4009 21FB 5444 2d1816 2d1816 pi

kodningar av qNaN och sNaN är inte helt specificerade i IEEE 754 och beror på processorn. De flesta processorer, som x86-familjen och ARM-familjen processorer, använder den viktigaste biten av significand-fältet för att indikera en tyst NaN; detta är vad som rekommenderas av IEEE 754. PA-RISC-processorerna använder biten för att indikera en signalering NaN.

som standard avrundar 1/3 ner, istället för upp som enkel precision, på grund av det udda antalet bitar i significand.

mer detaljerat:

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

exekveringshastighet med dubbel precision arithmeticEdit

med dubbel precision flytpunktsvariabler och matematiska funktioner (t.ex. sin, cos, atan2, log, exp och sqrt) är långsammare än att arbeta med sina enskilda precisions motsvarigheter. Ett område av databehandling där detta är ett särskilt problem är parallell kod som körs på GPU: er. När du till exempel använder Nvidias CUDA-plattform tar beräkningar med dubbel precision, beroende på en hårdvara, ungefär 2 till 32 gånger så lång tid att slutföra jämfört med de som görs med enkel precision.

Precisionsbegränsningar på heltal valuesEdit

  • heltal från -253 till 253 (-9007199254740992 till 9007199254740992) kan exakt representeras
  • heltal mellan 253 och 254 = 18014398509481984 runda till en multipel av 2 (jämnt antal)
  • heltal mellan 254 och 255 = 36028797018963968 runda till en multipel av 4

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *