Articles

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:

IEEE 754 kettős lebegőpontos formátum.svg

egy adott 64 bites kettős pontosságú adat valós értéke egy adott elfogult exponenssel e {\displaystyle e}

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

(-1)^{\text{sign}} (1.b_{51}b_{50}...p_{0})_{2}\alkalommal 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}}

(-1)^{\text{jele}}\left(1+\összeg _{i=1}^{52}p_{52-úgy}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 =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); és
  • 1111111111127ff16 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}}}

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

{\displaystyle (-1)^{\text{sign}}\times 2^{1-1023}\times 0.{\text{fraction}} = (-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{frakció}}}

EndiannessEdit

Ez a rész egy részlet Endianness § lebegőpontos
Bár a mindennapok x86-os processzorok a ma használt kis-endian tároló minden típusú adatok (egész, lebegőpontos), számos architektúrák, ahol a lebegőpontos számok képviselik a big-endian formája, miközben egész képviselteti magát little-endian formában. Vannak olyan ARM processzorok, amelyek félig kicsi endian, félig nagy endian lebegőpontos ábrázolással rendelkeznek a kettős pontosságú számokhoz: mindkét 32 bites szó kis-endi jellegű egész regiszterekben van tárolva, de a legjelentősebb először. Mivel sok lebegőpontos formátum létezik ,amelyeknek nincs” hálózati ” szabványos ábrázolása, az XDR szabvány a big-endian IEEE 754-et használja reprezentációként. Ezért furcsának tűnhet, hogy a széles körben elterjedt IEEE 754 lebegőpontos szabvány nem határozza meg az endiannesst. Elméletileg ez azt jelenti, hogy még az egyik gép által írt szabványos IEEE lebegőpontos adatok sem olvashatók a másik által. Azonban a modern szabványos számítógépeken (azaz az IEEE 754 végrehajtása) a gyakorlatban biztonságosan feltételezhetjük, hogy az endianness megegyezik a lebegőpontos számokkal, mint az egész számokkal, így az átalakítás egyszerű, az adattípustól függetlenül. (A speciális lebegőpontos formátumokat használó kis beágyazott rendszerek azonban más kérdés lehetnek.)

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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük