IEEE 754
Lo standard IEEE per il calcolo in virgola mobile (IEEE 754) (ufficialmente: IEEE Standard for Binary Floating-Point Arithmetic (ANSI/IEEE Std 754-1985) o anche IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems) è lo standard più diffuso nel campo del calcolo automatico. Questo standard definisce il formato per la rappresentazione dei numeri in virgola mobile (compreso ±0 e i numeri denormalizzati; gli infiniti e i NaN, "not a number"), ed un set di operazioni effettuabili su questi. Specifica inoltre quattro metodi di arrotondamento e ne descrive cinque eccezioni.
Esistono in questo standard quattro formati per i numeri in virgola mobile: a precisione singola (32 bit), precisione doppia (64 bit), precisione singola estesa (≥ 43 bit), raramente usato, e precisione doppia estesa (≥ 79 bit), supportata solitamente con 80 bit. La precisione singola è il minimo richiesto dallo standard, gli altri sono opzionali.
Struttura di un numero in virgola mobile
Un numero in virgola mobile, secondo lo standard IEEE è rappresentato su parole di 32, 64 o 128 bit divisi in tre parti:
- un bit di segno s;
- un campo di esponente e;
- un campo di mantissa m
in questo ordine. Gli n bit di una stringa sono indicizzati in modo decrescente con numeri interi da 0 a n-1. In un numero in questo standard, l'importanza del bit decresce col suo indice.
Numeri a 32bit
Di seguito è rappresentato un numero in una stringa di 32 bit:
1 8 23 lunghezza in bit +-+--------+-----------------------+ |S| Esp. | Mantissa | +-+--------+-----------------------+ 31 30 22 0 indice dei bit
Il valore del numero rappresentato è calcolabile come:
Il campo s specifica il segno del numero: 0 per i numeri positivi, 1 per i numeri negativi. Il campo e contiene l'esponente del numero in forma intera. Essendo costituito da 8 bit, permette di rappresentare 256 valori. I valori 0 e 255 vengono riservati per funzioni speciali (descritte in seguito); gli altri permettono di rappresentare 254 valori per i numeri in forma normale, compresi tra -126 e 127, dato che questo campo deve poter rappresentare sia numeri enormi che minimi; tuttavia, adoperando il metodo usato per la rappresentazione del segno dei numeri interi, si creerebbero problemi per il confronto tra numeri. Per risolvere questo problema, il campo è rappresentato in eccesso k detto bias (che è pari a 2^(n-1)-1 con n il numero di bit dell'esponente), per cui:
e = E + k
e reciprocamente
E = e - k
In questo standard, per i numeri a precisione singola, il bias è uguale a 127. In questa rappresentazione (chiamata polarizzazione), i valori dell'esponente compresi tra -126 e 127 assumono invece, nella scrittura del byte, i valori compresi tra 1 e 254, eliminando la necessità di un bit riservato al segno. In fase di decodifica del numero, il bias viene nuovamente sottratto per recuperare il valore originale.
[-126,...,0,...,127] --> [-126+127,...,0+127,...,127+127] --> [1,...,127,...,254] --> [00000001,...,01111111,...,11111110]
I valori assunti dall'esponente e e dalla mantissa m determinano l'appartenenza del numero ad una di queste categorie:
- zeri;
- numeri in forma normale;
- numeri in forma denormalizzata;
- infiniti;
- NaN (not a number).
L'esponente distingue i numeri in modo primario, la mantissa in modo secondario.
Categoria | Esp. | Mantissa |
---|---|---|
Zeri | 0 | 0 |
Numeri denormalizzati | 0 | non zero |
Numeri normalizzati | 1-254 | qualunque |
Infiniti | 255 | 0 |
Nan (not a number) | 255 | non zero |
Il campo m è una stringa di bit che rappresenta la sequenza di cifre dopo la virgola. Tutte le mantisse sono normalizzate in modo che il numero prima della virgola sia 1, per cui per un dato m il valore matematico corrispondente è
- M=1,m
In pratica, la mantissa è costituita dal numero binario 1, preceduto dalla virgola e dalla parte intera del numero rappresentato, in forma binaria; la mantissa risulta così artificialmente compresa tra 1 e 2. Quando un numero è normalizzato, come risulta dal suo esponente, il primo bit della mantissa, pari a 1, viene omesso per convenienza: viene quindi chiamato bit nascosto, o bit implicito.
Con questo sistema di rappresentazione, si hanno due zeri (+0 e −0) e due infiniti (+∞ e −∞) a seconda del valore del primo bit. Inoltre i numeri subnormali possono avere un segno e una mantissa, utili però solo per l'analisi.
Questo sistema di rappresentazione permette di avere una precisione relativa x quasi costante per tutti i valori rappresentabili. Infatti
Facciamo un semplice esempio: codifichiamo il numero −118.5 nel sistema IEEE 754.
Dobbiamo determinarne il segno, l'esponente e la mantissa.
Poiché è un numero negativo, il primo bit è "1".
Poi scriviamo il numero in forma binaria: 1110110,1.
Successivamente spostiamo la virgola verso sinistra, lasciando solo un 1 alla sua sinistra: .
La mantissa è la parte a destra della virgola, riempita con zeri a destra fino a riempire i 23 bit: 11011010000000000000000.
L'esponente è pari a 6, ma dobbiamo convertirlo in forma binaria e adattarlo allo standard. Per la precisione singola, dobbiamo aggiungere 127. Quindi 6 + 127 = 133. In forma binaria: 10000101.
Assemblando il tutto:
1 8 23 +-+--------+-----------------------+ |S| Esp | Mantissa | |1|10000101|11011010000000000000000| +-+--------+-----------------------+ 31 30 22 0
Numeri da 64 bit
La precisione a 64 bit è doppia rispetto a quella da 32 bit assunta come base dallo standard:
1 11 52 +-+-----------+----------------------------------------------------+ |S| Esp | Mantissa | +-+-----------+----------------------------------------------------+ 63 62 51 0
I NaN e gli infiniti sono rappresentati con esponenti formati da una serie di 1 (pari a 2047).
Per i numeri normalizzati il bias è pari a 1023 (quindi e = E + 1023). Per i numeri denormalizzati l'esponente è −1022 (il minimo esponente per un numero normalizzato). Come prima, sia gli infiniti che gli zeri possono essere rappresentati con entrambi i segni.
La precisione decimale è di circa 16 cifre decimali.
Numeri a 128 bit
La norma regolamenta infine i numeri da 128 bit, che permettono una precisione quadrupla rispetto ai numeri da 32 bit assunti come base dallo standard:
1 15 112 +-+---------------+---------------------------------------------------------------------------------+ |S| Esp | Mantissa | +-+---------------+---------------------------------------------------------------------------------+
Il numero di bits dedicati all'esponente sale da 11 a 15 e quelli per la mantissa a 112.
La precisione totale sale a circa 34 cifre decimali.
Il bias dell'esponente è pari a 16383 (quindi e = E − 16383).
Revisione dello standard
Lo standard è attualmente sotto revisione (IEEE 754r).
Conversione da decimale in formato P754
Esistono innumerevoli modi per rappresentare numeri in virgola mobile ma il sistema più utilizzato è lo standard IEEE P754; questo metodo comporta l'utilizzo della notazione scientifica, in cui ogni numero è identificato dal segno, da una mantissa (1,xxxxx) e dall'esponente (). La procedura standard per la conversione da numero decimale a numero binario P754 è la seguente:
- Prima di tutto il numero, in valore assoluto, va convertito in binario.
- Il numero va poi diviso (o moltiplicato) per 2 fino a ottenere una forma del tipo 1,xxxxxx.
- Di questo numero viene eliminato l'1 iniziale (per risparmiare memoria)
- Il numero di volte per cui il numero è stato diviso (o moltiplicato, e nel qual caso il valore sarà negativo) per 2 rappresenta l'esponente: questo valore (decimale) va espresso in eccesso 127, ovvero è necessario sommare 127 e convertire il numero risultante in binario. Nel caso di rappresentazione a precisione doppia (v. definizione seguente) il valore dell'esponente viene espresso in eccesso 1023.
A questo punto abbiamo raccolto tutti i dati necessari per memorizzare il numero: in base al numero di bit che abbiamo a disposizione possiamo utilizzare tre formati: il formato a precisione singola (32 bit), il formato a precisione doppia (64 bit) e il formato a precisione quadrupla (128 bit).
- Nel primo caso possiamo scrivere il valore utilizzando 1 bit per il segno, 8 bit per l'esponente e 23 bit per la mantissa.
- Nel secondo caso servirà 1 bit per il segno, 11 bit per l'esponente e 52 per la mantissa.
- Nel terzo caso servirà 1 bit per il segno, 15 bit per l'esponente e 112 per la mantissa.
Per esempio, convertiamo il valore in binario P754 single:
- Convertiamo prima di tutto il numero: per la parte intera e . Quindi il numero definitivo è (segno escluso).
- Dividiamo poi il numero per 2 per ottenere la seguente notazione:
- La mantissa diventa, quindi: 1100101.
- Per esprimere l'esponente in eccesso 127, infine:
Il numero, alla fine, sarà espresso nel formato:
Esempio di calcolo per numeri a precisione singola (32 bit)
Prendiamo per esempio il numero negativo frazionario:
-5,828125
Trasformiamo in binario la parte intera:
5:2=2 R=1 2:2=1 R=0 1:2=0 R=1
5(10) = 101(2)
Trasformiamo ora la parte decimale in binario:
0,828125*2=1,65625 U=1 0,65625 *2=1,3125 U=1 0,3125 *2=0,625 U=0 0,625 *2=1,25 U=1 0,25 *2=0,5 U=0 0,5 *2=1 U=1
0,828125(10) = 110101(2)
Uniamo ora le due parti:
101,110101
Spostiamo la virgola due posizioni verso sinistra riscrivendo in questo modo il risultato:
1,01110101*2^2
Otteniamo quindi la parte iniziale della nostra mantissa 01110101, ed avendo spostato verso sinistra la virgola di due posizioni per ottenere lo stesso numero dobbiamo moltiplicare 2 al quadrato.
A questo punto ricaviamo l'esponente sommando 2 al bias:
2+127=129
Trasformiamo questo numero in binario:
129:2=64 R=1 64:2=32 R=0 32:2=16 R=0 16:2= 8 R=0 8:2= 4 R=0 4:2= 2 R=0 2:2= 1 R=0 1:2= 0 R=1
129(10)=10000001(2)
Abbiamo così ottenuto il nostro numero in floating point ricordandoci di mettere ad 1 il bit del segno in quanto siamo partiti da un numero negativo:
-5,828125(10)=1|1000 0001|0111 0101 0000 0000 0000 000(2)
Se vogliamo ora esprimere in esadecimale il numero trovato (senza tener conto dell'eventuale formato Little Endian che modificherebbe la disposizione dei byte) non ci resta che suddividerlo a gruppi di quattro e trovare i valori esadecimali corrispondenti:
1100 0000 1011 1010 1000 0000 0000 0000 C 0 B A 8 0 0 0
In base sedici il nostro numero in floating point standard IEEE 754 sarà:
C0BA8000
Voci correlate
Altri progetti
Altri progetti
- Wikimedia Commons
- Wikimedia Commons contiene immagini o altri file sull'IEEE 754
Collegamenti esterni
- (EN) Sito ufficiale, su grouper.ieee.org.
- (EN) Denis Howe, IEEE Floating Point Standard, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
V · D · M | |||||||
---|---|---|---|---|---|---|---|
Attuali | 488 · 730 · 754 (Revision) · 854 · 828 · 829 · 896 · 1003 · 1014 · 1016 · 1076 · 1149.1 · 1154 · 1164 · 1275 · 1278 · 1284 · 1355 · 1394 · 1451 · 1497 · 1516 · 1541 · 1547 · 1584 · 1588 · 1596 · 1603 · 1613 · 1666 · 1667 · 1675 · 1685 · 1722 · 1733 · 1800 · 1801 · 1815 · 1850 · 1900 · 1901 · 1902 · 1904 · 1905 · 2030 · 2050 · 11073 · 12207 · 14764 · 16085 · 16326 · 29148 · 42010 | ||||||
802 series |
| ||||||
Proposte | P1363 · P1619 · P1699 · P1823 · P1906.1 | ||||||
Sostituite | 754-1985 · 830 · 1219 · 1233 · 1362 · 1364 · 1471 |
V · D · M | |
---|---|
IEC standard | IEC 60027 · IEC 60034 · IEC 60038 · IEC 60062 · IEC 60063 · IEC 60068 · IEC 60112 · IEC 60228 · IEC 60269 · IEC 60297 · IEC 60309 · IEC 60320 · IEC 60364 · IEC 60446 · IEC 60559 · IEC 60601 · IEC 60870 (IEC 60870-5 · IEC 60870-6) · IEC 60906-1 · IEC 60908 · IEC 60929 · IEC 60958 (AES3 · S/PDIF) · IEC 61030 · IEC 61131 (IEC 61131-3 · IEC 61131-9) · IEC 61158 · IEC 61162 · IEC 61334 · IEC 61346 · IEC 61355 · IEC 61360 · IEC 61400 · IEC 61499 · IEC 61508 · IEC 61511 · IEC 61784 · IEC 61850 · IEC 61851 · IEC 61883 · IEC 61960 · IEC 61968 · IEC 61970 · IEC 62014-4 · IEC 62026 · IEC 62056 · IEC 62061 · IEC 62196 · IEC 62262 · IEC 62264 · IEC 62304 · IEC 62325 · IEC 62351 · IEC 62365 · IEC 62366 · IEC 62379 · IEC 62386 · IEC 62455 · IEC 62680 · IEC 62682 · IEC 62700 · IEC 63110 · IEC 63119 |
ISO/IEC standard | ISO/IEC 646 · ISO/IEC 2022 · ISO/IEC 4909 · ISO/IEC 5218 · ISO/IEC 6429 · ISO/IEC 6523 · ISO/IEC 7810 · ISO/IEC 7811 · ISO/IEC 7812 · ISO/IEC 7813 · ISO/IEC 7816 · ISO/IEC 7942 · ISO/IEC 8613 · ISO/IEC 8632 · ISO/IEC 8652 · ISO/IEC 8859 · ISO/IEC 9126 · ISO/IEC 9293 · ISO/IEC 9592 · ISO/IEC 9593 · ISO/IEC 9899 · ISO/IEC 9945 · ISO/IEC 9995 · ISO/IEC 10021 · ISO/IEC 10116 · ISO/IEC 10165 · ISO/IEC 10179 · ISO/IEC 10646 · ISO/IEC 10967 · ISO/IEC 11172 · ISO/IEC 11179 · ISO/IEC 11404 · ISO/IEC 11544 · ISO/IEC 11801 · ISO/IEC 12207 · ISO/IEC 13250 · ISO/IEC 13346 · ISO/IEC 13522-5 · ISO/IEC 13568 · ISO/IEC 13818 · ISO/IEC 14443 · ISO/IEC 14496 · ISO/IEC 14882 · ISO/IEC 15288 · ISO/IEC 15291 · ISO/IEC 15408 · ISO/IEC 15444 · ISO/IEC 15445 · ISO/IEC 15504 · ISO/IEC 15511 · ISO/IEC 15693 · ISO/IEC 15897 · ISO/IEC 15938 · ISO/IEC 16262 · ISO/IEC 17024 · ISO/IEC 17025 · ISO/IEC 18000 · ISO/IEC 18004 · ISO/IEC 18014 · ISO/IEC 19752 · ISO/IEC 19757 · ISO/IEC 19770 · ISO/IEC 19788 · ISO/IEC 20000 · ISO/IEC 21000 · ISO/IEC 21827 · ISO/IEC 23000 · ISO/IEC 23003 · ISO/IEC 23008 · ISO/IEC 23270 · ISO/IEC 23360 · ISO/IEC 24707 · ISO/IEC 24727 · ISO/IEC 24744 · ISO/IEC 24752 · ISO/IEC 26300 · ISO/IEC 27000 · ISO/IEC 27001 · ISO/IEC 27002 · ISO/IEC 27040 · ISO/IEC 27032 · ISO/IEC 29119 · ISO/IEC 33001 · ISO/IEC 38500 · ISO/IEC 42010 · ISO/IEC80000 |