Formato a virgola mobile IEEE

Microsoft C++ (MSVC) è coerente con gli standard numerici IEEE. Lo standard IEEE-754 descrive i formati a virgola mobile, un modo per rappresentare i numeri reali nell'hardware. Esistono almeno cinque formati interni per i numeri a virgola mobile che sono rappresentabili nell'hardware di destinazione del compilatore MSVC. Il compilatore usa solo due di essi. I formati a precisione singola (4 byte) e precisione doppia (8 byte) vengono usati in MSVC. La precisione singola viene dichiarata usando la parola chiave float. La precisione doppia viene dichiarata usando la parola chiave double. Lo standard IEEE specifica anche formati a metà precisione (2 byte) e precisione (16 byte) e un formato a precisione doppia estesa (10 byte), che alcuni compilatori C e C++ implementano come long double tipo di dati. Nel compilatore MSVC il long double tipo di dati viene considerato come un tipo distinto, ma il tipo di archiviazione esegue il mapping a double. Esiste tuttavia il supporto intrinseco e del linguaggio assembly per i calcoli usando gli altri formati, incluso il formato a precisione doppia estesa, in cui è supportato dall'hardware.

I valori vengono archiviati nel modo seguente:

Valore Archiviato come
precisione singola segno bit, esponente a 8 bit, significando a 23 bit
precisione doppia segno bit, esponente a 11 bit, significando a 52 bit

Nei formati a precisione singola e a precisione doppia, nella parte frazionaria esiste un carattere iniziale 1. La parte frazionaria è detta significando (talvolta nota come mantissa). Questo 1 iniziale non viene archiviato in memoria, quindi i significandi sono in realtà 24 o 53 bit, anche se un bit viene archiviato. Il formato a precisione doppia estesa archivia effettivamente questo bit.

Gli esponenti sono distorti per metà del loro valore possibile. Significa che si sottrae questa distorsione dall'esponente archiviato per ottenere l'esponente effettivo. Se l'esponente archiviato è minore del pregiudizio, è in realtà un esponente negativo.

Gli esponenti sono distorti come segue:

Esponente Distorsione di
8 bit (precisione singola) 127
11 bit (precisione doppia) 1023

Questi esponenti non sono poteri di dieci; sono poteri di due. Ovvero, gli esponenti archiviati a 8 bit possono variare da -127 a 127, archiviati come da 0 a 254. Il valore 2127 equivale approssimativamente a 1038, ovvero il limite effettivo di precisione singola.

Il significando viene archiviato come frazione binaria del formato 1.XXX... . Questa frazione ha un valore maggiore o uguale a 1 e minore di 2. I numeri reali vengono sempre archiviati in formato normalizzato. Ovvero, il significando viene spostato a sinistra in modo che il bit di ordine elevato del significando sia sempre 1. Poiché questo bit è sempre 1, viene considerato (non archiviato) nei formati a precisione singola e precisione doppia. Si presuppone che il punto binario (non decimale) sia solo a destra dell'elemento 1 iniziale.

Il formato per la rappresentazione a virgola mobile è il seguente:

Formato byte 1 byte 2 byte 3 byte 4 ... byte n
precisione singola SXXXXXXX XMMMMMMM MMMMMMMM MMMMMMMM
precisione doppia SXXXXXXX XXXXMMMM MMMMMMMM MMMMMMMM ... MMMMMMMM

S rappresenta il bit del segno, i X's sono i bit esponenti distorti, e ' Ms sono i bit significandi. Il bit più a sinistra viene considerato in formati a precisione singola e precisione doppia.

Per spostare correttamente il punto binario, prima si annulla l'bia l'esponente e quindi si sposta il punto binario a destra o a sinistra il numero di bit appropriato.

Valori speciali

I formati a virgola mobile includono alcuni valori trattati in modo speciale.

Zero

Zero non può essere normalizzato, che lo rende non rappresentabile nella forma normalizzata di un valore a precisione singola o precisione doppia. Un modello di bit speciale di tutti gli zere rappresenta 0. È anche possibile rappresentare -0 come zero con il bit di segno impostato, ma -0 e 0 vengono sempre confrontati come uguali.

Infiniti

I valori +∞ e −∞ sono rappresentati da un esponente di tutti i valori e da un significando che è tutto zero. I valori positivi e negativi sono rappresentati usando il bit del segno.

Sottonormali

È possibile rappresentare numeri di grandezza minore rispetto al numero più piccolo in forma normalizzata. Vengono chiamati numeri subnormati o denormali . Se l'esponente è tutti zero e il significando è diverso da zero, il bit iniziale implicito del significando viene considerato zero, non uno. La precisione dei numeri subnormati scende man mano che il numero di zere iniziali nel significando sale.

NaN - Non un numero

È possibile rappresentare valori che non sono numeri reali, ad esempio 0 /0, nel formato a virgola mobile IEEE. Un valore di questo tipo è denominato NaN. Un NaN è rappresentato da un esponente di tutti e da un significando diverso da zero. Esistono due tipi di nan, nan non silenziosi o QNaN e segnalazione di nan o SNaN. I nan non crittografati hanno uno iniziale nel significando e vengono propagati tramite un'espressione. Rappresentano un valore indeterminato, ad esempio il risultato della divisione per infinito o la moltiplicazione di un infinito per zero. I nan di segnalazione hanno uno zero iniziale nel significando. Vengono usati per le operazioni che non sono valide, per segnalare un'eccezione hardware a virgola mobile.

Esempi

Di seguito sono riportati alcuni esempi in formato a precisione singola:

  • Per il valore 2, il bit del segno è zero. L'esponente archiviato è 128 o 1000 0000 in binario, ovvero 127 più 1. Il significando binario archiviato è (1.) 000 0000 0000 0000 0000 0000, che ha un punto iniziale implicito 1 e binario, quindi il significando effettivo è uno.

    Valore Formula Rappresentazione binaria Esadecimale
    2 1 * 21 0100 0000 0000 0000 0000 0000 0000 0000 0x40000000
  • Valore -2. Uguale a +2, ad eccezione del fatto che il bit del segno è impostato. La stessa cosa è vera per il negativo di tutti i numeri a virgola mobile in formato IEEE.

    Valore Formula Rappresentazione binaria Esadecimale
    -2 -1 * 21 1100 0000 0000 0000 0000 0000 0000 0000 0xC0000000
  • Valore 4. Lo stesso significando, l'esponente aumenta di uno (il valore distorto è 129 o 100 0000 1 in binario.

    Valore Formula Rappresentazione binaria Esadecimale
    4 1 * 2 2 0100 0000 1000 0000 0000 0000 0000 0000 0x40800000
  • Valore 6. Lo stesso esponente, significand è più grande per metà. È (1.) 100 0000 ... 0000 0000, che, poiché è una frazione binaria, è 1 1/2 perché i valori delle cifre frazionarie sono 1/2, 1/4, 1/8 e così via.

    Valore Formula Rappresentazione binaria Esadecimale
    6 1,5 * 22 0100 0000 1100 0000 0000 0000 0000 0000 0x40C00000
  • Valore 1. Lo stesso significando di altri poteri di due, l'esponente distorto è uno minore di due a 127 o 011 1111 1 in binario.

    Valore Formula Rappresentazione binaria Esadecimale
    1 1 * 20 0011 1111 1000 0000 0000 0000 0000 0000 0x3F800000
  • Valore 0,75. L'esponente distorto è 126, 011 1111 0 in binario e il significando è (1.) 100 0000 ... 0000 0000, ovvero 1 1/2.

    Valore Formula Rappresentazione binaria Esadecimale
    0.75 1.5 * 2-1 0011 1111 0100 0000 0000 0000 0000 0000 0x3F400000
  • Valore 2,5. Esattamente come due ad eccezione del fatto che il bit che rappresenta 1/4 è impostato nel significando.

    Valore Formula Rappresentazione binaria Esadecimale
    2.5 1,25 * 21 0100 0000 0010 0000 0000 0000 0000 0000 0x40200000
  • 1/10 è una frazione ripetuta in binario. Il significando è leggermente inferiore a 1,6 e l'esponente distorto dice che 1,6 deve essere diviso per 16. È 011 1101 1 in binario, ovvero 123 in decimale. L'esponente vero è 123 - 127 = -4, il che significa che il fattore per cui moltiplicare è 2-4 = 1/16. Il significando archiviato viene arrotondato nell'ultimo bit nel tentativo di rappresentare il numero non rappresentabile nel modo più accurato possibile. Il motivo per cui 1/10 e 1/100 non sono esattamente rappresentabili in binary è simile al motivo per cui 1/3 non è esattamente rappresentabile in decimale.

    Valore Formula Rappresentazione binaria Esadecimale
    0,1 1.6 * 2-4 0011 1101 1100 1100 1100 1100 1100 1101 0x3DCCCCCD
  • Zero è un caso speciale. Usa la formula per il valore positivo rappresentabile minimo possibile, ovvero tutti gli zeri.

    Valore Formula Rappresentazione binaria Esadecimale
    0 1 * 2-128 0000 0000 0000 0000 0000 0000 0000 0000 0x00000000

Vedi anche

Causa della possibile perdita di precisione dei numeri a virgola mobile