Articles

Formato a virgola mobile a doppia precisione

La virgola mobile binaria a doppia precisione è un formato comunemente usato sui PC, grazie alla sua gamma più ampia rispetto alla virgola mobile a precisione singola, nonostante le sue prestazioni e il costo della larghezza di banda. È comunemente noto semplicemente come doppio. Lo standard IEEE 754 specifica un binary64 come avente:

  • Segno bit: 1 bit
  • Esponente: 11 bit
  • Significato e precisione: 53 bit (52 memorizzati esplicitamente)

Il segno bit determina il segno del numero (anche quando questo numero è zero, che è firmato).

Il campo esponente è un numero intero senza segno a 11 bit da 0 a 2047, in forma parziale: un valore esponente di 1023 rappresenta lo zero effettivo. Gli esponenti vanno da -1022 a +1023 perché gli esponenti di -1023 (tutti 0) e +1024 (tutti 1) sono riservati ai numeri speciali.

La precisione significand a 53 bit fornisce da 15 a 17 cifre decimali significative di precisione (2-53 ≈ 1.11 × 10-16). Se una stringa decimale con al massimo 15 cifre significative viene convertita nella rappresentazione a doppia precisione IEEE 754 e quindi convertita in una stringa decimale con lo stesso numero di cifre, il risultato finale deve corrispondere alla stringa originale. Se un numero a doppia precisione IEEE 754 viene convertito in una stringa decimale con almeno 17 cifre significative e quindi riconvertito in una rappresentazione a doppia precisione, il risultato finale deve corrispondere al numero originale.

Il formato è scritto con il significato e con un bit intero implicito di valore 1 (ad eccezione dei dati speciali, vedere la codifica esponente di seguito). Con i 52 bit del significato della frazione (F) e che appaiono nel formato di memoria, la precisione totale è quindi di 53 bit (circa 16 cifre decimali, 53 log10(2) ≈ 15.955). I bit sono disposti come segue:

IEEE 754 Double Floating Point Format.svg

Il valore reale assunto da un dato dato a doppia precisione a 64 bit con un dato esponente di parte e {\displaystyle e}

e

e una frazione a 52 bit è (- 1 ) sign ( 1. b 51 b 50 . . . b 0) 2 × 2 e-1023 {\displaystyle (-1)^{\text {sign}} (1.b_{51} b_ {50}…b_ {0}) _ {2}\volte 2^{e-1023}}

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

o

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

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

Tra i 252=4,503,599,627,370,496 e 253=9,007,199,254,740,992 i numeri rappresentabili sono esattamente i numeri interi. Per l’intervallo successivo, da 253 a 254, tutto viene moltiplicato per 2, quindi i numeri rappresentabili sono quelli pari, ecc. Viceversa, per l’intervallo precedente da 251 a 252, la spaziatura è 0,5, ecc.

La spaziatura come frazione dei numeri nell’intervallo da 2n a 2n+1 è 2n−52.L’errore di arrotondamento relativo massimo quando si arrotondano un numero a quello rappresentabile più vicino (la macchina epsilon) è quindi 2-53.

La larghezza di 11 bit dell’esponente consente la rappresentazione di numeri tra 10-308 e 10308, con precisione completa di 15-17 cifre decimali. Compromettendo la precisione, la rappresentazione subnormale consente valori ancora più piccoli fino a circa 5 × 10-324.

Exponent encodingEdit

L’esponente binario a virgola mobile a doppia precisione viene codificato utilizzando una rappresentazione offset-binaria, con l’offset zero pari a 1023; noto anche come exponent bias nello standard IEEE 754. Esempi di tali rappresentazioni sono:

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); e
  • 1111111111127ff16 è usato per rappresentare ∞ (se F = 0) e NaNs (se F 0 0),

dove F è la parte frazionaria del significato. Tutti i modelli di bit sono codifica valida.

Fatta eccezione per le eccezioni di cui sopra, l’intero numero a doppia precisione è descritto da:

(- 1 ) segno × 2 e − 1023 × 1. frazione {\displaystyle (-1)^{\testo{segno}}\volte 2^{e-1023}\volte 1.{\text {fraction}}}

{\displaystyle (-1)^{\text{sign}}\volte 2^{e-1023}\volte 1.{\text {fraction}}}

Nel caso di subnormali (e = 0) il numero a doppia precisione è descritto da:

(- 1 ) segno × 2 1 − 1023 × 0. frazione = (- 1 ) segno × 2-1022 × 0. frazione {\displaystyle (-1)^{\testo{segno}}\volte 2^{1-1023}\volte 0.{\text {fraction}}=(-1)^{\text{sign}}\volte 2^{-1022}\volte 0.{\text {fraction}}}

{\displaystyle (-1)^{\text{sign}}\volte 2^{1-1023}\volte 0.{\text {fraction}}=(-1)^{\text{sign}}\volte 2^{-1022}\volte 0.{\text{frazione}}}

EndiannessEdit

in Questa sezione sono tratte da Endianness § virgola Mobile
anche se l’onnipresente processori x86 di oggi in little-endian di archiviazione per tutti i tipi di dati (interi, virgola mobile), ci sono un certo numero di architetture hardware, dove i numeri a virgola mobile sono rappresentati in big-endian modulo, mentre i numeri interi sono rappresentati in little-endian forma. Ci sono processori ARM che hanno metà little-endian, metà big-endian rappresentazione in virgola mobile per i numeri a doppia precisione: entrambe le parole a 32 bit sono memorizzate in little-endian come registri interi, ma prima la più significativa. Poiché ci sono stati molti formati in virgola mobile senza alcuna rappresentazione standard di “rete” per loro, lo standard XDR utilizza big-endian IEEE 754 come sua rappresentazione. Può quindi sembrare strano che il diffuso standard IEEE 754 a virgola mobile non specifichi endianness. Teoricamente, ciò significa che anche i dati in virgola mobile standard IEEE scritti da una macchina potrebbero non essere leggibili da un’altra. Tuttavia, sui moderni computer standard (es., implementando IEEE 754), in pratica si può tranquillamente supporre che l’endianness sia lo stesso per i numeri in virgola mobile come per gli interi, rendendo la conversione semplice indipendentemente dal tipo di dati. (Piccoli sistemi embedded che utilizzano speciali formati in virgola mobile possono essere un’altra questione tuttavia.)

Doppia precisione 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)

iv in questo modo si può ottenere una codifica alternativa di NaN.

0 01111111101 01010101010101010101010101010101010101010101010101012=3FD5.

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

Le codifiche di qNaN e sNaN non sono completamente specificate in IEEE 754 e dipendono dal processore. La maggior parte dei processori, come la famiglia x86 e i processori della famiglia ARM, utilizza il bit più significativo del campo significand per indicare un NaN silenzioso; questo è ciò che è raccomandato da IEEE 754. I processori PA-RISC utilizzano il bit per indicare una segnalazione NaN.

Per impostazione predefinita, 1/3 arrotonda verso il basso, invece di aumentare come precisione singola, a causa del numero dispari di bit nel significato.

Più in dettaglio:

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

La velocità di esecuzione con aritmetica a doppia precisionedit

Utilizzando variabili a virgola mobile a doppia precisione e funzioni matematiche (ad esempio, sin, cos, atan2, log, exp e sqrt) è più lenta rispetto al lavoro con le loro controparti a precisione singola. Un’area di calcolo in cui questo è un problema particolare è il codice parallelo in esecuzione su GPU. Ad esempio, quando si utilizza la piattaforma CUDA di NVIDIA, i calcoli con doppia precisione richiedono, a seconda di un hardware, da 2 a 32 volte più tempo da completare rispetto a quelli eseguiti con precisione singola.

Precisione limitazioni sull’intero valuesEdit

  • i numeri Interi da -253 a 253 (-9007199254740992 per 9007199254740992) può essere rappresentata esattamente
  • numeri Interi tra il 253 e 254 = 18014398509481984 giro con un multiplo di 2 (numero pari)
  • numeri Interi tra 254 e 255 = 36028797018963968 giro con un multiplo di 4

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *