Articles

Kaksitarkkuuksinen liukulukumuoto

Kaksitarkkuuksinen binäärinen liukuluku on yleisesti käytetty formaatti tietokoneissa, koska se on suorituskyvystään ja kaistanleveyskustannuksistaan huolimatta laajempi kuin yksitarkkuuksinen liukuluku. Se on yleisesti tunnettu yksinkertaisesti kaksinkertainen. IEEE 754-standardi määrittelee binary64: n omaavaksi:

  • Merkkibitti: 1 bitti
  • eksponentti: 11 bittiä
  • Significand precision: 53 bittiä (52 eksplisiittisesti tallennettua)

merkkibitti määrittää numeron merkin (myös silloin, kun tämä luku on nolla, joka allekirjoitetaan).

eksponenttikenttä on 11-bittinen signeeraamaton kokonaisluku välillä 0-2047, puolueellisessa muodossa: eksponenttiarvo 1023 kuvaa todellista Nollaa. Eksponentit vaihtelevat -1022: sta +1023: een, koska eksponentit -1023 (kaikki 0s) ja +1024 (kaikki 1S) on varattu erityisluvuille.

53-bittinen merkitysja tarkkuus antaa 15-17 merkitsevän desimaaliluvun tarkkuuden (2-53 ≈ 1,11 × 10-16). Jos desimaalijono, jossa on enintään 15 merkitsevää numeroa, muunnetaan IEEE 754: n kaksitarkkuusesitykseksi ja sitten muunnetaan takaisin desimaalijonoksi, jossa on sama määrä numeroita, lopputuloksen tulee vastata alkuperäistä merkkijonoa. Jos IEEE 754: n kaksitarkkuusluku muunnetaan desimaalijonoksi, jossa on vähintään 17 merkitsevää numeroa, ja sitten muunnetaan takaisin kaksitarkkuusesitykseksi, lopullisen tuloksen on vastattava alkuperäistä lukua.

muoto kirjoitetaan signifikaatiolla, jolla on implisiittinen kokonaisluku bitti, jonka arvo on 1 (lukuun ottamatta erikoistietoja, katso alla oleva eksponenttikoodaus). Kun murtoluvun (F) 52 bittiä merkitään ja esiintyy muistimuodossa, kokonaistarkkuus on siis 53 bittiä (noin 16 desimaalia, 53 log10 (2) ≈ 15.955). Bitit esitetään seuraavasti:

IEEE 754 Double Floating Point Format.svg

tietyn 64-bittisen kaksitarkkuusdatumin olettama reaaliarvo, jolla on annettu puolueellinen eksponentti e {\displaystyle e}

e

ja 52-bittinen fraktio on (- 1 ) merkki ( 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}...b_{0})_{2}\times 2^{e-1023}

tai

( − 1 ) sign ( 1 + ∑ I = 1 52 b 52 − I 2 − i ) × 2 e − 1023 {\displaystyle (-1)^{\text{sign}}\left(1+\sum _{I=1}^{52}b_{52-I}2^{-I}\right)\times 2^{e-1023}}

(-1)^{\text{sign}}\left(1+\sum _{I=1}^{52}b_{52-I}2^{-I}\right)\times 2^{e-1023}

between 252=4,503,599,627,370,496 ja 253=9,007,199,254,740,992 edustavat luvut ovat täsmälleen kokonaislukuja. Seuraavalla alueella, 253: sta 254: ään, kaikki kerrotaan 2: lla, joten edustettavat luvut ovat parillisia jne. Vastaavasti edellisen alueen 251-252 väli on 0,5 jne.

väli lukujen murtolukuna alueella 2n−2n+1 on 2n-52.Suurin suhteellinen pyöristysvirhe pyöristettäessä lukua lähimpään edustavaan (koneen epsilon) on siis 2-53.

eksponentin 11 bitin leveys mahdollistaa lukujen esittämisen välillä 10-308 ja 10308, täydellä 15-17 desimaaliluvun tarkkuudella. Tinkimällä tarkkuus, subnormal representaatio mahdollistaa vieläkin pienempiä arvoja noin 5 × 10-324.

eksponentti koodaa edit

kaksitarkkuuksinen binäärinen liukulukupisteen eksponentti koodataan offset-binääriesityksellä, jossa nollasiirtymä on 1023; tunnetaan myös nimellä eksponenttiharha IEEE 754-standardissa. Esimerkkejä tällaisista representaatioista olisivat:

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); ja
  • 1111111111127ff16 käytetään edustamaan ∞ (jos F = 0) ja NaNs (jos F ≠ 0),

missä F on merkitysten murto-osa. Kaikki bittikuviot ovat kelvollisia koodauksia.

edellä mainittuja poikkeuksia lukuun ottamatta koko kaksoistarkkuuslukua kuvaa:

(- 1 ) merkki × 2 e − 1023 × 1. murtoluku {\displaystyle (-1)^{\text{sign}}\times 2^{e-1023}\times 1.{\text{fraktio}}}

{\displaystyle (-1)^{\text{sign}}\times 2^{e-1023}\times 1.{\text {fraktio}}}

subnormaalien (E = 0) tapauksessa kaksoistarkkuuslukua kuvaa:

(- 1 ) merkki × 2 1 − 1023 × 0. fraktio = (−1 ) merkki × 2-1022 × 0. murtoluku {\displaystyle (-1)^{\text{sign}}\times 2^{1-1023}\times 0.{\text{fraktio}}=(-1)^{\text{sign}}\times 2^{-1022}\times 0.{\text{fraktio}}}

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

EndiannessEdit

tämä osa on ote Endianness § liukuva piste
tämä osa on ote Endianess § liukuva piste

vaikka nykyiset ubiquitous x86-suorittimet käyttävät little-endian-tallennustilaa kaikenlaisille tiedoille (kokonaisluku, liukuva piste), on olemassa useita laitearkkitehtuureja, joissa liukulukuluvut esitetään big-endian muodossa, kun taas kokonaisluvut ovat edustettuna pikku-endian muodossa. On ARM-suorittimia, joissa on puoliksi pieni-endian, puoliksi iso-endian liukulukuedustus kaksoistarkkuuksisille luvuille: molemmat 32-bittiset sanat tallennetaan pikku-endian kaltaisiin kokonaislukurekistereihin, mutta merkittävin ensin. Koska on ollut monia liukulukumuotoja, joilla ei ole niille ”verkko” – standardiesitystä, XDR-standardi käyttää big-endian IEEE 754-esitystapaa. Siksi voi vaikuttaa oudolta, että laajalle levinnyt IEEE 754-liukulukustandardi ei määrittele loppulukua. Teoriassa tämä tarkoittaa sitä, että edes yhden koneen kirjoittama standardi IEEE-liukulukutieto ei välttämättä ole toisen koneen luettavissa. Kuitenkin nykyaikaisissa standarditietokoneissa (so., toteutettaessa IEEE 754), voidaan käytännössä turvallisesti olettaa, että loppuluku on sama liukulukuluvuille kuin kokonaisluvuille, jolloin muuntaminen on suoraviivaista tietotyypistä riippumatta. (Pienet sulautetut järjestelmät, joissa käytetään erityisiä liukulukumuotoja, voivat kuitenkin olla toinen asia.)

Kaksoistarkkuusesimerkki

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 (NaN vaihtoehtoinen koodaus)

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

Qnanin ja snanin koodauksia ei ole täysin määritelty IEEE 754: ssä ja ne riippuvat suorittimesta. Useimmat suorittimet, kuten x86-perhe ja ARM-perheen suorittimet, käyttävät significand-kentän merkittävintä bittiä hiljaisen NaN ilmaisemiseen; tätä IEEE 754 suosittelee. PA-RISC-suorittimet käyttävät bittiä merkitäkseen NaN-signaalia.

oletusarvoisesti 1/3 kierrosta alaspäin, eikä ylöspäin kuten yksittäinen tarkkuus, koska merkityksessä on pariton määrä bittejä.

tarkemmin:

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

suoritusnopeus kaksinkertaisen tarkkuuden aritmeettisella editorilla

käyttäen kaksinkertaista tarkkuutta vaativia liukulukumuuttujia ja matemaattisia funktioita (esim.sin, cos, atan2, log, exp ja sqrt) ovat hitaampia kuin yhden tarkkuuskollegansa kanssa. Yksi tietojenkäsittelyn alue, jossa tämä on erityinen ongelma, on rinnakkainen koodi, joka toimii GPU: lla. Esimerkiksi käytettäessä Nvidian CUDA-alustaa laskelmat kaksinkertaisella tarkkuudella vievät laitteistosta riippuen noin 2-32 kertaa niin kauan kuin ne tehdään yhdellä tarkkuudella.

Kokonaislukuarvojen Tarkkuusrajoitukset

  • kokonaisluvut -253-253 (-9007199254740992-9007199254740992) voidaan esittää tarkasti
  • kokonaisluvut välillä 253-254 = 18014398509481984 pyöreäksi 2: n kerrannaiseksi (parillinen luku)
  • kokonaisluvut välillä 254-255 = 36028797018963968 kierros kerrannaiseksi 4

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *