Articles

Dublu-precizie în virgulă mobilă format

dublu-precizie binar în virgulă mobilă este un format frecvent utilizat pe PC-uri, datorită gamei sale mai largi peste virgulă mobilă cu o singură precizie, în ciuda performanței sale și costul lățimii de bandă. Este cunoscut pur și simplu ca dublu. Standardul IEEE 754 specifică un binary64 ca având:

  • bit semn: 1 bit
  • Exponent: 11 biți
  • Significand precision: 53 biți (52 stocate în mod explicit)

bitul semn determină semnul numărului (inclusiv atunci când acest număr este zero, care este semnat).

câmpul exponent este un număr întreg nesemnat pe 11 biți de la 0 la 2047, în formă părtinitoare: o valoare exponentă de 1023 reprezintă zero real. Exponenții variază de la -1022 la +1023 deoarece exponenții -1023 (toate 0s) și +1024 (toate 1s) sunt rezervate numerelor speciale.

precizia semnificativa pe 53 de biti confera de la 15 la 17 cifre zecimale semnificative precizie (2-53 int.1.11 int. 10-16). Dacă un șir zecimal cu cel mult 15 cifre semnificative este convertit în reprezentarea cu dublă precizie IEEE 754 și apoi convertit înapoi într-un șir zecimal cu același număr de cifre, rezultatul final ar trebui să se potrivească cu șirul original. Dacă un număr cu dublă precizie IEEE 754 este convertit într-un șir zecimal cu cel puțin 17 cifre semnificative și apoi convertit înapoi în reprezentare cu dublă precizie, rezultatul final trebuie să se potrivească cu numărul original.

formatul este scris cu semnificativși având un bit întreg implicit de valoare 1 (cu excepția datelor speciale, a se vedea codificarea exponentului de mai jos). Cu cei 52 de biți ai fracției (F) semnificativi și care apar în formatul de memorie, precizia totală este, prin urmare, de 53 de biți (aproximativ 16 cifre zecimale, 53 log10(2) 15.955). Biții sunt stabiliți după cum urmează:

IEEE 754 format dublu în virgulă mobilă.svg

valoarea reală asumată de un dat dat de precizie dublă pe 64 de biți cu un exponent părtinitor dat e {\displaystyle e}

e

și o fracție de 52 de biți este semnul (- 1) (1. b 51 b 50 . . . b 0) 2 2 e − 1023 {\displaystyle (-1)^{\text{semn}}(1.b_{51}b_{50}…b_{0})_{2}\ori 2^{e-1023}}

(-1)^{\text{semn}}(1.b_{51}b_{50}...b_{0})_{2}\ori 2^{e-1023}

sau

( − 1 ) semn ( 1 + i = 1 52 B 52 − i 2 − i) 2 e − 1023 {\displaystyle (-1)^{\text{semn}}\stânga(1+\sumă _{i=1}^{52}b_{52-i}2^{-I}\dreapta)\ori 2^{e-1023}}

(-1)^{\text{semn}}\stânga(1+\sumă _{i=1}^{52}b_{52-i}2^{-I}\dreapta)\ori 2^{e-1023}

între 252=4.503.599.627.370.496 și 253=9.007.199.254.740.992 numerele reprezentabile sunt exact numerele întregi. Pentru următorul interval, de la 253 la 254, totul este înmulțit cu 2, astfel încât numerele reprezentative sunt cele pare etc. În schimb, pentru intervalul anterior de la 251 la 252, distanța este de 0,5 etc.

distanța ca fracțiune a numerelor din intervalul de la 2n la 2n+1 este 2n−52.Eroarea maximă de rotunjire relativă la rotunjirea unui număr la cel mai apropiat număr reprezentabil (mașina epsilon) este, prin urmare, 2-53.

lățimea de 11 biți a exponentului permite reprezentarea numerelor între 10-308 și 10308, cu precizie completă de 15-17 cifre zecimale. Prin compromiterea preciziei, reprezentarea subnormală permite valori și mai mici până la aproximativ 5 centimetrii 10-324.

Exponent encodingEdit

exponentul binar în virgulă mobilă cu dublă precizie este codificat folosind o reprezentare offset-binară, compensarea zero fiind 1023; cunoscută și sub numele de părtinire exponentă în standardul IEEE 754. Exemple de astfel de reprezentări ar fi:

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); și
  • 1111111111127ff16 este folosit pentru a reprezenta valorile de la: (dacă F = 0) și Nans (dacă f 0),

unde F este partea fracționată a semnificației. Toate modelele de biți sunt codificare validă.

cu excepția excepțiilor de mai sus, întregul număr de dublă precizie este descris prin:

(- 1 ) semnul 2 e − 1023 1. fracție {\displaystyle (-1)^{\text{semn}}\ori 2^{e-1023}\ori 1.{\text {fracție}}}

{\displaystyle (-1)^{\text{semn}}\ori 2^{e-1023}\ori 1.{\text{fraction}}}

în cazul subnormalelor (e = 0) Numărul de dublă precizie este descris prin:

(- 1 ) semnul 2 1 − 1023 0. fracție = (−1) semn 0 − 1022 0. fracție {\displaystyle (-1)^{\text{semn}}\ori 2^{1-1023}\ori 0.{\text{fracție}} = (-1)^{\text{semn}}\ori 2^{-1022}\ori 0.{\text {fracție}}}

{\displaystyle (-1)^{\text{semn}}\ori 2^{1-1023}\ori 0.{\text{fracție}} = (-1)^{\text{semn}}\ori 2^{-1022}\ori 0.{\text{fraction}}}

Endiannessed

această secțiune este un fragment din Endianness in virgulă mobilă in virgulă mobilă in virgulă mobilă in virgulă mobilă in virgulă mobilă in virgulă mobilă in virgulă mobilă in virgulă mobilă in virgulă mobilă in în formă mică-endiană. Există procesoare ARM care au jumătate mică-endiană, jumătate mare-endiană reprezentare în virgulă mobilă pentru numere cu dublă precizie: ambele cuvinte pe 32 de biți sunt stocate în registre întregi de tip Little-endian, dar cel mai semnificativ mai întâi. Deoarece au existat multe formate în virgulă mobilă fără reprezentare standard „rețea” pentru acestea, standardul XDR folosește big-endian IEEE 754 ca reprezentare. Prin urmare, poate părea ciudat faptul că standardul larg răspândit IEEE 754 în virgulă mobilă nu specifică endianitatea. Teoretic, acest lucru înseamnă că chiar și datele standard IEEE în virgulă mobilă scrise de o mașină ar putea să nu poată fi citite de alta. Cu toate acestea, pe computerele standard moderne (adică., implementarea IEEE 754), se poate presupune în practică în siguranță că endianitatea este aceeași pentru numerele în virgulă mobilă ca și pentru numerele întregi, făcând conversia simplă indiferent de tipul de date. (Sistemele mici încorporate care utilizează formate speciale în virgulă mobilă pot fi totuși o altă problemă.)

exemple de precizie Dublăedit

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 ffff fffff16 Nan (o codificare alternativă a NaN)

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

codificările qNaN și sNaN nu sunt complet specificate în IEEE 754 și depind de procesor. Majoritatea procesoarelor, cum ar fi familia x86 și procesoarele familiei ARM, utilizează cel mai semnificativ bit al câmpului significand pentru a indica un Nan liniștit; aceasta este ceea ce este recomandat de IEEE 754. Procesoarele PA-RISC folosesc bitul pentru a indica o semnalizare NaN.

în mod implicit, 1/3 runde în jos, în loc de sus ca precizie unică, din cauza numărului impar de biți în significand.

mai detaliat:

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

viteza de execuție cu aritmetică de precizie dublă

folosind variabile în virgulă mobilă de precizie dublă și funcții matematice (de exemplu, sin, cos, atan2, log, exp și sqrt) sunt mai lente decât lucrul cu omologii lor de precizie unică. Un domeniu de calcul în care aceasta este o problemă specială este codul paralel care rulează pe GPU-uri. De exemplu, atunci când se utilizează platforma CUDA NVIDIA, calculele cu dublă precizie durează, în funcție de un hardware, de aproximativ 2 până la 32 de ori mai mult pentru a fi finalizate în comparație cu cele realizate folosind o singură precizie.

limitări de precizie ale valorilor integeredit

  • întregi de la -253 la 253 (-9007199254740992 la 9007199254740992) pot fi reprezentate exact
  • întregi între 253 și 254 = 18014398509481984 rotund la un multiplu de 2 (Număr par)
  • numere întregi între 254 și 255 = 36028797018963968 rotunde la un multiplu de 4

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *