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:
Il valore reale assunto da un dato dato a doppia precisione a 64 bit con un dato esponente di parte e {\displaystyle 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}}
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}}
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 = 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); e -
111111111112
7ff16
è 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}}}
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}}}
EndiannessEdit
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