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:
det verkliga värdet antas av en given 64-bitars dubbel precision datum med en given partisk exponent e {\displaystyle 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}}
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}}
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 = 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); och -
111111111112
7ff16
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}}}
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}}}
EndiannessEdit
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 11111111111111111111111111111111111111111111111111112
7fff 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