A kettős pontosságú lebegőpontos formátum
A kettős pontosságú bináris lebegőpont a PC-ken általánosan használt formátum, az egy pontosságú lebegőpontos tartománynak köszönhetően, a teljesítmény és a sávszélesség költsége ellenére. Ez közismert egyszerűen kettős. Az IEEE 754 szabvány meghatározza, hogy egy binary64, mint, hogy:
- Jel bit: 1 bit
- Exponens: 11 bit
- Significand pontosság: 53 bit (52 kifejezetten tárolt)
A jel kicsit meghatározza a jele, hogy a szám (beleértve, ha ez a szám nulla, amely alá).
az exponens mező egy 11 bites előjel nélküli egész szám 0-tól 2047-ig, elfogult formában: az 1023 exponens értéke a tényleges nulla. Az exponensek -1022-től +1023-ig terjednek, mivel a -1023 (mind a 0s) és a +1024 (mind az 1s) exponensek speciális számokra vannak fenntartva.
Az 53 bites significand precíziós ad 15-17 jelentős tizedes számjegy pontossággal (2-53 ≈ 1,11 × 10-16). Ha egy legfeljebb 15 jelentős számjegyű tizedes karakterláncot IEEE 754 kettős pontosságú ábrázolássá alakítanak át, majd ugyanannyi számjegyű tizedes karakterláncra konvertálják, akkor a végeredménynek meg kell egyeznie az eredeti karakterlánccal. Ha egy IEEE 754 kettős pontosságú számot legalább 17 jelentős számjegyű tizedes karakterláncra alakítanak át, majd dupla pontosságú ábrázolásra konvertálják, a végeredménynek meg kell egyeznie az eredeti számmal.
a formátumot a significand írja, amelynek implicit egész bit értéke 1 (kivéve a speciális adatokat, lásd az exponens kódolását alább). A frakció (F) 52 bitje jelentősés a memória formátumban jelenik meg, ezért a teljes pontosság 53 bit (körülbelül 16 decimális számjegy, 53 log10(2) ≈ 15.955). A bitek az alábbiak szerint vannak elrendezve:
egy adott 64 bites kettős pontosságú adat valós értéke egy adott elfogult exponenssel e {\displaystyle e}
és egy 52 bites frakció (- 1 ) jel (1. b 51 b 50 . . . b 0 ) 2 × 2 e − 1023 {\displaystyle (-1)^{\text{sign}}} (1.b_{51}b_{50}…b_{0})_{2} \ times 2^{e-1023}}
vagy
( − 1 ) jel ( 1 + ∑ i = 1 52 b 52 − nem 2 − nem ) × 2 e − 1023 {\displaystyle (-1)^{\text{jele}}\left(1+\összeg _{i=1}^{52}p_{az 52.-i}2^{-én}\right)\times 2^{e-1023}}
Között 252=4,503,599,627,370,496, valamint 253=9,007,199,254,740,992 az ábrázolható számok pontosan az egész számok. A következő tartományban, 253-tól 254-ig, mindent megszoroznak 2-vel, így a reprezentálható számok egyenletesek stb. Ezzel szemben az előző 251-252 tartományban a távolság 0,5 stb.
a távolság a 2n−től 2n-ig+1-ig terjedő számok frakciójaként 2N-52.A legnagyobb relatív kerekítési hiba, ha egy számot a legközelebbi reprezentálhatóra kerekítünk (a gép epsilon), ezért 2-53.
az exponens 11 bites szélessége lehetővé teszi a 10-308 és 10308 közötti számok ábrázolását, teljes 15-17 tizedesjegy pontossággal. A pontosság veszélyeztetésével a szubnormális ábrázolás még kisebb értékeket tesz lehetővé körülbelül 5 × 10-324-ig.
exponens encodingEdit
a kettős pontosságú bináris lebegőpontos exponens egy offset-bináris ábrázolással van kódolva, a nulla eltolás 1023; az IEEE 754 szabványban exponens torzításként is ismert. Ilyen ábrázolások például:
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); és -
111111111112
7ff16
A ∞ (if F = 0) és a NaNs (if F ≠ 0),
ahol F a significand frakcionált része. Minden bit minták érvényes kódolás.
a fenti kivételek kivételével a teljes kettős pontosságú számot a következő írja le:
(−1 ) jel × 2 e − 1023 × 1. frakció {\displaystyle (-1)^{\text{sign}}\times 2^{e-1023}\times 1.{\text{fraction}}}
alnormálok esetén (e = 0) a kettős pontosságú számot a következő írja le:
(- 1 ) jel × 2 1 − 1023 × 0. frakció = (−1 ) jel × 2-1022 × 0. frakció {\displaystyle (-1)^{\text{sign}}\times 2^{1-1023}\times 0.{\text{fraction}} = (-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{fraction}}}
EndiannessEdit
kettős pontosságú példákszerkesztés
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 (A Nan alternatív kódolása)
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
a qNaN és sNaN kódolása nincs teljesen meghatározva az IEEE 754-ben, és a processzortól függ. A legtöbb processzor, mint például az x86 család és az ARM family processzorok, a significand mező legjelentősebb részét használja a csendes NaN jelzésére; ezt ajánlja az IEEE 754. A PA-RISC processzorok a bitet használják jelző NaN jelzésére.
alapértelmezés szerint 1/3 fordul le, ahelyett, hogy akár egyetlen pontosság, mert a páratlan számú bit a significand.
részletesebben:
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
végrehajtási sebesség kettős pontosságú arithmeticEdit
kettős pontosságú lebegőpontos változók és matematikai függvények (pl. sin, cos, atan2, log, exp és sqrt) használata lassabb, mint az egy pontosságú társaikkal való munka. A számítástechnika egyik területe, ahol ez egy adott kérdés, a GPU-kon futó párhuzamos kód. Például az NVIDIA CUDA platformjának használatakor a kettős pontosságú számítások a hardvertől függően körülbelül 2-32-szer olyan hosszúak, hogy befejeződjenek, mint az egyetlen pontossággal végzett számítások.
precíziós korlátozások egész értékekreszerkesztés
- egész számok -253-tól 253-ig (-9007199254740992-ig 9007199254740992) pontosan ábrázolhatók
- egészek 253 és 254 között = 18014398509481984 forduló 2 (páros szám) többszörösére
- egész számok 254 és 255 között = 36028797018963968 forduló 4
többszörösére