In informatica , IEEE 754 è uno standard per l'aritmetica in virgola mobile sviluppato dall'Institute of Electrical and Electronics Engineers . Attualmente è lo standard più utilizzato per il calcolo dei numeri in virgola mobile con CPU e FPU . Lo standard definisce i formati per rappresentare i numeri in virgola mobile ( segno , mantissa , esponente , numeri denormalizzati ) e valori speciali ( infinito e NaN ), insieme a una serie di operazioni in virgola mobile. Descrive inoltre cinque modalità di arrotondamento e cinque eccezioni (comprese le condizioni in cui si verifica un'eccezione e cosa accade in quel caso).
La versione originale di IEEE 754, risalente al 1985, definiva quattro formati per rappresentare i numeri in virgola mobile in base 2:
Ad esempio, nel linguaggio C , il compilatore gcc per architetture compatibili con Intel a 32 bit utilizza il formato single precision per variabili di tipo float , double precision per variabili di tipo double e double precision o extended double precision (seguendo il sistema operativo) per variabili doppie lunghe . Tuttavia, se l' estensione SSE2 non viene utilizzata, tutti i calcoli vengono arrotondati alla stessa precisione, a seconda dell'impostazione della precisione dinamica del processore (in genere doppia precisione o doppia precisione estesa, a seconda del sistema operativo, delle opzioni di compilazione e delle modifiche apportate da programmi).
Il titolo completo dello standard era IEEE Standard for Binary Floating-Point Arithmetic (ANSI / IEEE Std 754-1985 ). È anche noto con il nome IEC 60559: 1989, Binary floating-point arithmetic for microprocessor systems , che lo rende anche uno standard (americano), poiché approvato come riferimento normativo in diversi standard ISO internazionali. Tuttavia, questo standard è stato esteso da un'importante revisione nel 2008 ad altri formati di base (binario su 128 bit e decimale su 64 e 128 bit), nonché formati di scambio (aggiungendo formati meno precisi o più precisi) e formati estesi ( generalizzazione dello standard del 1985, con maggiore libertà di precisione e codifica rispetto ai formati di scambio); questa revisione include anche modalità di arrotondamento aggiuntive e requisiti di conformità più rigorosi per quanto riguarda l'accuratezza prevista delle operazioni e dei calcoli delle funzioni trascendentali di base. Anche questo standard è stato rivisto nel 2019.
In una parola di lunghezza W, i bit sono indicizzati da 0 a W - 1, inclusi. Il bit 0 è posizionato a destra e rappresenta il bit meno significativo (ovvero il bit delle unità, che causerà la variazione più piccola se modificato).
Un numero in virgola mobile è composto da tre elementi: la mantissa , l'esponente e il segno. Il bit più significativo è il bit di segno : se questo bit è a 1, il numero è negativo, e se è a 0, il numero è positivo. I successivi e bit rappresentano l'esponente distorto (eccetto il valore speciale), e i successivi m bit ( m bit meno significativi) rappresentano la mantissa.
Cartello | Esponente di polarizzazione | Mantissa |
(1 bit) | ( e bit) | ( m bit) |
L'esponente può essere positivo o negativo. Tuttavia, la normale rappresentazione dei numeri con segno ( complemento di 2 ) renderebbe un po 'più difficile il confronto tra i numeri in virgola mobile. Per risolvere questo problema, l'esponente è "asimmetrico", in modo da memorizzarlo come numero senza segno.
Questo bias è 2 e −1 - 1 ( e rappresenta il numero di bit nell'esponente); è quindi un valore costante una volta fissato il numero di bit e .
L'interpretazione di un numero (diverso dall'infinito) è quindi: valore = segno × mantissa × 2 ( esponente - bias ) con
Il bit più significativo della mantissa è determinato dal valore dell'esponente distorto. Se l'esponente polarizzato è diverso da 0 e da , il bit più significativo della mantissa è 1 e il numero viene definito "normalizzato". Se l'esponente distorto è zero, il bit più significativo della mantissa è zero e il numero viene denormalizzato .
Ci sono tre casi speciali:
Possiamo riassumere così:
genere | Esponente di polarizzazione | Mantissa |
---|---|---|
Zeri | 0 | 0 |
Numeri denormalizzati | 0 | diverso da 0 |
Numeri normalizzati | a | qualunque |
Infinito | 0 | |
NaNs | diverso da 0 |
Un numero in virgola mobile a precisione singola viene memorizzato in una parola a 32 bit: 1 bit di segno, 8 bit per l'esponente e 23 per la mantissa.
L'esponente è quindi influenzato da in questo caso. L'esponente di un numero normalizzato va quindi da -126 a +127. L'esponente -127 (che è polarizzato verso il valore 0) è riservato per i numeri zero e denormalizzati, mentre l'esponente 128 (polarizzato verso 255) è riservato per codificare infiniti e NaN (vedere la tabella precedente).
Un numero in virgola mobile normalizzato ha un valore v dato dalla seguente formula:
v = s × 2 e × m .Ad esempio per 0b 0 01111100 01000000000000000000000: il segno è positivo, l'esponente è 124-127 = −3 e la parte significativa è 0b 1,01 cioè 1,25 in decimale (1 × 2 0 + 0 × 2 −1 + 1 × 2 - 2 ); il numero rappresentato è quindi +1,25 × 2 −3 o +0,15625.
I numeri denormalizzati seguono lo stesso principio, se non che e = -126 e m = 0+ mantissa (nota: per il calcolo, ci prenderemo cura di prendere e = -126 -127 e non, al fine di garantire la continuità di questo rappresentazione con la rappresentazione normalizzata, poiché m = 0+ mantissa e non più m = 1+ mantissa ).
Appunti:
Di seguito è riportata una tabella che riepiloga la parte precedente, con esempi di numeri a 32 bit a precisione singola.
genere | Espositore | Mantissa | Valore approssimativo | Deviazione / prec |
---|---|---|---|---|
Zero | 0000 0000 | 000 0000 0000 0000 0000 0000 | 0.0 | |
Numero denormalizzato più piccolo | 0000 0000 | 000 0000 0000 0000 0000 0001 | 1,4 × 10 −45 | 1,4 × 10 −45 |
Numero successivo denormalizzato | 0000 0000 | 000 0000 0000 0000 0000 0010 | 2,8 × 10 −45 | 1,4 × 10 −45 |
Numero successivo denormalizzato | 0000 0000 | 000 0000 0000 0000 0000 0011 | 4,2 × 10 −45 | 1,4 × 10 −45 |
Altro numero denormalizzato | 0000 0000 | 100 0000 0000 0000 0000 0000 | 5,9 × 10 −39 | |
Il più grande numero denormalizzato | 0000 0000 | 111 1111 1111 1111 1111 1111 | 1.175 494 21 × 10 −38 | |
Numero normalizzato più piccolo | 0000 0001 | 000 0000 0000 0000 0000 0000 | 1.175 494 35 × 10 −38 | 1,4 × 10 −45 |
Numero successivo standardizzato | 0000 0001 | 000 0000 0000 0000 0000 0001 | 1.175 494 49 × 10 −38 | 1,4 × 10 −45 |
Quasi il doppio | 0000 0001 | 111 1111 1111 1111 1111 1111 | 2.350 988 56 × 10 −38 | 1,4 × 10 −45 |
Numero successivo standardizzato | 0000 0010 | 000 0000 0000 0000 0000 0000 | 2.350 988 70 × 10 −38 | 1,4 × 10 −45 |
Numero successivo standardizzato | 0000 0010 | 000 0000 0000 0000 0000 0001 | 2.350 988 98 × 10 −38 | 2,8 × 10 −45 |
Quasi 1 | 0111 1110 | 111 1111 1111 1111 1111 1111 | 0.999 999 94 | 0,6 × 10 −7 |
1 | 0111 1111 | 000 0000 0000 0000 0000 0000 | 1.000.000 00 | |
Prossimo numero 1 | 0111 1111 | 000 0000 0000 0000 0000 0001 | 1.000.000 12 | 1,2 × 10 −7 |
Quasi il maggior numero | 1111 1110 | 111 1111 1111 1111 1111 1110 | 3.402 823 26 × 10 38 | |
Numero standardizzato più grande | 1111 1110 | 111 1111 1111 1111 1111 1111 | 3.402 823 46 × 10 38 | 2 × 10 31 |
Infinito | 1111 1111 | 000 0000 0000 0000 0000 0000 | Infinito | |
Primo valore (denormalizzato) dell'avviso NaN | 1111 1111 | 000 0000 0000 0000 0000 0001 | no | |
NaN normalizzato (allarme) | 1111 1111 | 010 0000 0000 0000 0000 0000 | no | |
Ultimo valore (denormalizzato) dell'avviso NaN | 1111 1111 | 011 1111 1111 1111 1111 1111 | no | |
Primo valore (denormalizzato) del NaN silenzioso | 1111 1111 | 100 0000 0000 0000 0000 0000 | no | |
Ultimo valore (denormalizzato) del NaN silenzioso | 1111 1111 | 111 1111 1111 1111 1111 1111 | no |
Appunti:
Codifichiamo il numero decimale −118.625 utilizzando il meccanismo IEEE 754.
Abbiamo quindi −118.625 (dec) = 1100 0010 1110 1101 0100 0000 0000 0000 (bin) = C2ED4000 (hexa).
Il formato a doppia precisione è uguale a quello a precisione singola, tranne per il fatto che i campi sono più grandi. In effetti, ha 52 bit di mantissa invece di soli 23 e 11 bit di esponente invece di soli 8.
La mantissa è molto ampia, mentre l'esponente non è molto ampio. Questo perché, secondo i creatori dello standard, la precisione è più importante dell'ampiezza.
I NaN e gli infiniti sono rappresentati impostando tutti i bit dell'esponente a 1 (2047), ma distinti impostando tutti i 52 bit della mantissa a 0 per gli infiniti e almeno uno di questi 52 bit a 1 per il No .
Per i numeri normalizzati, il bias esponente è +1023. Per i numeri denormalizzati, l'esponente è −1022 (l'esponente minimo per un numero normalizzato). Non è -1023 perché i numeri normalizzati hanno un 1 prima del punto decimale, mentre i numeri denormalizzati no. Come prima, zero e infinito sono firmati.
Appunti:
In genere è meglio confrontare i numeri in virgola mobile utilizzando le istruzioni di calcolo in virgola mobile. Tuttavia, questa rappresentazione rende possibile il confronto di alcuni sottoinsiemi byte per byte, se hanno lo stesso ordine di byte e lo stesso segno e i NaN sono esclusi.
Ad esempio, per due numeri in virgola mobile positivi a e b, il confronto tra a e b (>, <o ==) fornisce gli stessi risultati del confronto di due numeri con segno (o senza segno) con gli stessi bit di a e b. In altre parole, due numeri in virgola mobile positivi (che non sono NaN) possono essere confrontati con un confronto binario con segno (o senza segno). A causa del problema dell'ordine dei byte, questo confronto non può essere utilizzato nel codice portatile.
Lo standard IEEE specifica 5 modalità di arrotondamento:
Nel giugno 2008, una revisione importante degli standard IEEE 754 e IEEE 854 è stata approvata dall'IEEE. Vedi: IEEE 754-2008 (en) .
Questa revisione introduce nuovi formati base 2 e base 10 e specifica la rappresentazione dei formati base 10 (oltre a base 2).
Normalizza anche una relazione d' ordine totale per ciascuno dei tipi di dati numerici normalizzati, integrando le solite relazioni d'ordine che sono solo parziali; infatti la relazione di ordine normale è totale solo a condizione di rimuovere dall'insieme dei valori, il valore zero negativo (normalmente confrontato come uguale al valore zero positivo) e tutti i valori NaN (che non sono né uguali, né superiori, né inferiore a qualsiasi altro, nemmeno a se stessi).
D'altra parte, questa revisione lascia la flessibilità di rappresentazione e possibile distinzione dei valori NaN (la posizione e il valore del / i bit di avviso nel campo mantissa non sono standardizzati, e l'uso degli altri bit di il campo mantissa o segno di un valore NaN per codificare un errore rimane dipendente dall'architettura o dalle applicazioni).
Una nuova revisione è stata approvata in luglio 2019.