Salta al contenuto
Note per Studenti Virgola mobile - formato IEEE 754 e formato a 16 bit

Virgola mobile - formato IEEE 754 e formato a 16 bit

In questa pagina 5

L'aritmetica a virgola fissa (Virgola fissa - formati n.m e normalizzazioneIn virgola fissa il processore fa aritmetica sugli interi (con segno) e il fattore di scalacostante per cui si moltiplica un valore reale per ottenere l'intero memorizzato $2^{m}$ resta sottinteso: il formato n.m dice che dei bit disponibili $n$ sono la parte intera (compreso il segno se il numero è con segno, S; nessun segno se U) e $m$ la parte frazionaria. Il valore è $\text{codice}/2^m$. Passare dal formato n.m al decimale, o viceversa, è il calcolo più frequente dell'esame: su 16 bit $\text{valore}=\text{codice}/2^m$, l'intervallo è $[0,2^n)$ (U) oppure $[-2^{n-1},2^{n-1})$ (S), la risoluzione è $2^{-m}$.Virgola fissa - formati n.m e normalizzazione →) tiene la virgola in una posizione stabilita una volta per tutte. Questo può compromettere l'accuratezzaquanto il valore rappresentato è vicino a quello vero: un esempio tipico è A+BA−B\frac{A+B}{A-B} con A=234,235A=234{,}235 e B=234,234B=234{,}234, quasi uguali. Il risultato di A−BA-B ha una sola cifra significativa e quindi l'accuratezza del quoziente è bassissima (cosa succede con B=234,233B=234{,}233?). Alcuni DSP, e pochissimi µC, usano allora la virgola mobile (floating point).

Precisione e accuratezza non sono la stessa cosa. La precisionenumero di cifre significative usate per rappresentare un numero è il numero di cifre significative usate; l'accuratezza misura quanto il valore rappresentato è vicino al vero. π=3,14\pi=3{,}14 è meno preciso di π=3,241592\pi=3{,}241592 ma è più accurato.

La rappresentazione

Si usa la notazione scientifica normalizzatascrittura di un numero come una mantissa tra 1 e 2 per una potenza della base in base 2: 1,xxxxx⋅2yyy1{,}xxxxx\cdot2^{yyy}. La parte xxxxxxxxxx è la mantissa, yyyyyy l'esponente. Lo standard IEEE 754standard internazionale adottato da tutti i processori recenti per la virgola mobile scrive x=(−1)S (1+F) 2E−B,x=(-1)^S\,(1+F)\,2^{E-B}, dove SS è il bit di segno, F∈[0,1)F\in[0,1) la parte frazionaria della mantissa (l'11 a sinistra della virgola è implicito, non si memorizza), EE il campo esponentela potenza di 2 per cui si moltiplica la mantissa (un intero senza segno) e BB l'offsetcostante sottratta al campo esponente per ottenere l'esponente vero, così gli esponenti negativi si scrivono con un campo non negativo (bias). La parola ha tre campi: S  ∣  E  ∣  FS\;|\;E\;|\;F.

Singola precisione (32 bit): SS: 1 bit; EE: 8 bit (valori 0…2550\dots255, offset B=127B=127); FF: 23 bit. Esistono anche la doppia (64 bit) e la quadrupla (128 bit) precisione. Intervallo dei positivi: 2−126≈1,2⋅10−38≤x≤2127≈1,7⋅10382^{-126}\approx1{,}2\cdot10^{-38}\le x\le2^{127}\approx1{,}7\cdot10^{38}.

Per ogni valore dell'esponente i valori possibili della mantissala parte del numero che contiene le cifre significative sono "solo" 2232^{23}; poiché gli esponenti sono 282^8, i positivi rappresentabili sono in totale 2312^{31}: tanti quanti quelli rappresentabili in virgola fissa su 32 bit. Cambia solo la spaziaturadistanza tra due numeri rappresentabili consecutivi: non è costante ma cresce con l'esponente. La distanza relativa tra due numeri consecutivi, rapportata a 2E−B2^{E-B}, è invece costante e vale ε=2−nF\varepsilon=2^{-n_F} (precisione di macchinadistanza relativa minima tra due numeri rappresentabili: 2 elevato a meno il numero di bit della mantissa, nFn_F numero di bit della mantissa).

Valori riservati: il campo esponente tutto a 0 (valore −B-B dopo l'offset) serve a codificare lo zero, che non si potrebbe rappresentare con una mantissa nulla a causa dell'11 implicito; lo zerovalore 0: ha una codifica propria perché la mantissa implicita parte da 1 è quindi una parola priva di uni. Il campo esponente tutto a 1 serve per gli overflowvalore troppo grande per essere rappresentato e i valori non numerici (NaNNot a Number: codice che indica un risultato non rappresentabile o non definito).

Il formato a 16 bit dell'esame

Nelle prove di Elettronica Industriale si usa una ALU a virgola mobilerappresentazione in cui la posizione della virgola cambia con un esponente a 16 bit con: bit 15 = segno SS; bit 14-11 = esponente (4 bit, offset B=7B=7); bit 10-0 = mantissa (11 bit, 11 implicito). Gli esponenti validi sono E=1…14E=1\dots14, cioè 2−6…272^{-6}\dots2^{7}, quindi il massimo valore è circa 28=2562^8=256.

Decodifica

Esempio: 0  1010  011001101010\;1010\;01100110101. S=0S=0; E=10102=10E=1010_2=10, esponente 10−7=310-7=3; F=011001101012=821/2048=0,4009F=01100110101_2=821/2048=0{,}4009. Valore: (1+0,4009)⋅23=11,207(1+0{,}4009)\cdot2^3=11{,}207. Con S=1S=1, E=10002=8E=1000_2=8 (esponente 11) e la stessa mantissa: −(1,4009)⋅2=−2,802-(1{,}4009)\cdot2=-2{,}802. Con 0  1100  111000110000\;1100\;11100011000: E=12E=12 (esponente 5), F=1816/2048=0,8867F=1816/2048=0{,}8867: 1,8867⋅32=60,3751{,}8867\cdot32=60{,}375.

Codifica

  1. Il segno: bit SS.
  2. Normalizzazione: scrivere ∣x∣=1,f⋅2e|x|=1{,}f\cdot2^e con e=⌊log⁡2∣x∣⌋e=\lfloor\log_2|x|\rfloor.
  3. Campo esponente E=e+7E=e+7.
  4. Mantissa: F=round((∣x∣/2e−1)⋅211)F=\mathrm{round}\big((|x|/2^e-1)\cdot2^{11}\big) (11 bit; con arrotondamento, o con troncamentoeliminazione dei bit bassi senza arrotondare se richiesto).
  5. Errore: ∣xrap−x∣|x_{rap}-x|.

Esempio x=−104,871x=-104{,}871: 104,871=1,6386⋅26104{,}871=1{,}6386\cdot2^6, e=6e=6, E=13=11012E=13=1101_2; F=(104,871/64−1)⋅2048=0,6386⋅2048=1307,9→1308=101000111002F=(104{,}871/64-1)\cdot2048=0{,}6386\cdot2048=1307{,}9\to1308=10100011100_2. Parola: 1  1101  10100011100=0xED1C1\;1101\;10100011100=\texttt{0xED1C}. Valore rappresentato −(1+1308/2048)⋅64=−104,875-(1+1308/2048)\cdot64=-104{,}875; errore ∣ε∣=0,004|\varepsilon|=0{,}004. Per −110,256-110{,}256 con troncamento della mantissa: 1  1101  101110010001\;1101\;10111001000 (cioè 0xEDC8\texttt{0xEDC8}), valore −110,25-110{,}25, errore 6⋅10−36\cdot10^{-3}.

Gli interi e le frazioni con pochi bit significativi sono rappresentati esattamente: 223,75=1,101111111⋅27223{,}75=1{,}101111111\cdot2^7 (0x75FC\texttt{0x75FC}: 0  1110  101111111000\;1110\;10111111100) e −83,375-83{,}375 (0xEA6C\texttt{0xEA6C}: 1  1101  010011011001\;1101\;01001101100) non hanno errore.

Somma in virgola mobile

L'operazione richiede (1) identificare l'addendo con l'esponente minore; (2) allinearlo spostando a destra la sua mantissa fino a rendere uguali gli esponenti (nello shift si perdono i bit bassi: troncamento); (3) sommare (o sottrarre) le mantisse; (4) normalizzareriportare la mantissa tra 1 e 2 correggendo l'esponente il risultato (mantissa tra 1 e 2) correggendo l'esponente.

Esempio (formato a 16 bit con 5 bit di esponente, B=15B=15, 10 di mantissa). 152,8−35,4152{,}8-35{,}4. 152,8→0  10110  0011000110152{,}8\to0\;10110\;0011000110 (=152,75=152{,}75, esponente 77); 35,4→1  10100  000110110135{,}4\to1\;10100\;0001101101 come addendo negativo (esponente 55, =−35,406=-35{,}406). Gli esponenti differiscono di 2: la mantissa del secondo (con 1 implicito: 1 0001101101=11331\,0001101101=1133) si sposta di 2 posti a destra: 283283 (si perdono i due bit bassi: troncamento!). Mantisse con 1 implicito: 1222−283=939=111010101121222-283=939=1110101011_2. Il risultato è già normalizzato per l'esponente 7: 939/1024⋅27=117,375939/1024\cdot2^7=117{,}375. Il valore esatto è 117,4117{,}4: errore 0,0250{,}025, dovuto ai bit persi nell'allineamento.

Nell'esempio d'esame 223,75+(−83,375)=140,375=1,0001100011⋅27223{,}75+(-83{,}375)=140{,}375=1{,}0001100011\cdot2^7: i due operandi sono esatti, e si allineano (esponenti 7 e 6) senza perdere bit: risultato 0x70C6\texttt{0x70C6} (0  1110  000110001100\;1110\;00011000110), errore nullo.

Quando conviene la virgola mobile

I circuiti sono molto più complessi di quelli per la virgola fissa (due ALU, due shifter, circuito per gli esponenti, arrotondamento), ma i µC/DSP in virgola mobile mantengono comunque anche la sezione a virgola fissa, che costa poco. Alcuni µC hanno un'unità aritmetica ausiliaria a virgola mobile in singola precisione (ARM Cortex-M4). I DSP per il controllo real time sono ancora tutti a virgola fissa; per il signal processing prevale la virgola mobile. Nei numeri a virgola mobile il segno è un bit separato dalla mantissa (codifica in modulo e segno), non il complemento a 2.

Errori comuni

  • Dimenticare l'11 implicito (decodificando (F) 2E−B(F)\,2^{E-B} invece di (1+F) 2E−B(1+F)\,2^{E-B}).
  • Dimenticare l'offset: E=1010E=1010 vale esponente 33, non 1010.
  • Sommare le mantisse prima di avere uguagliato gli esponenti.
  • Confondere precisione (cifre significative) e accuratezza (vicinanza al valore vero).

Versione ripasso

Esercizi su questo argomento

Teoria collegata