Salta al contenuto
Note per Studenti Virgola fissa - formati n.m e normalizzazione

Virgola fissa - formati n.m e normalizzazione

In questa pagina 5
** 2m2^{m} resta sottinteso: il formato **n.m** dice che dei bit disponibili nn sono la parte intera (compreso il segno se il numero è con segno, **S**; nessun segno se **U**) e mm la parte frazionaria. Il valore è codice/2m\text{codice}/2^m. Passare dal formato **n.m** al decimale, o viceversa, è il calcolo più frequente dell'esame: su 16 bit valore=codice/2m\text{valore}=\text{codice}/2^m, l'intervallo è [0,2n)[0,2^n) (U) oppure [−2n−1,2n−1)[-2^{n-1},2^{n-1}) (S), la risoluzione è 2−m2^{-m}. -->

L'aritmetica a virgola fissa (fixed pointnumeri con la virgola in una posizione stabilita una volta per tutte dal programmatore) è quella usata nella maggior parte dei µC e in molti DSP. In sostanza è l'aritmetica degli interi con segno (Numeri binari e complemento a dueI processori lavorano con un numero fisso di bit $n$. I naturali vanno da $0$ a $2^n-1$; per i negativi si usa il complemento a due: $C_2(N)=2^n-N=\overline N+1$ (si invertono tutti i bit e si somma 1). Con $n$ bit rappresenta $-2^{n-1}\le N\le2^{n-1}-1$, ha un solo zero e unifica somma e sottrazione. Quando il risultato esce dall'intervallo c'è overflow; gli overflow intermedi si compensano se il risultato finale è rappresentabile. La lunghezza di parola non è l'accuratezza.Numeri binari e complemento a due →), più un fattore di normalizzazionecostante 2 elevato a m per cui si moltiplica il valore reale prima di arrotondarlo a intero 2m2^m deciso dal programmatore e mai scritto nel dato. Fissare la normalizzazionescelta del fattore di scala, cioè di dove sta la virgola, per un dato significa fissare l'intervallo dei valori rappresentabili. Senza conoscerla è impossibile decodificare un numero.

Il formato n.m

Si indica con n.m una parola in cui:

  • mm è il numero di bit della parte frazionaria (la virgola è mm posti a destra del bit meno significativo);
  • nn è il numero di bit della parte intera; se il numero è con segno (S), in nn è incluso il bit di segno; se è senza segno (U), tutti gli nn bit sono di valore.

Su una parola di WW bit si ha n+m=Wn+m=W. Il valore del codice intero CC (letto come naturale per U, come complemento a 2codifica dei numeri con segno: il negativo di N su n bit è 2 elevato a n meno N per S) è x=C2me viceversaC=round(x⋅2m).\boxed{x=\frac{C}{2^m}}\qquad\text{e viceversa}\qquad C=\mathrm{round}(x\cdot2^m).

  • Formato U: 0≤x≤2n−2−m0\le x\le2^n-2^{-m}.
  • Formato S: −2n−1≤x≤2n−1−2−m-2^{n-1}\le x\le2^{n-1}-2^{-m}.
  • Risoluzione (passo tra due valori vicini, il peso del bit meno significativo, LSBLeast Significant Bit: il bit meno significativo; per un valore normalizzato pesa 2−m2^{-m}): 2−m2^{-m}. L'errore massimo di arrotondamentosostituzione del valore con il più vicino rappresentabile è metà passo: 2−(m+1)2^{-(m+1)}.

Tabella per W=16W=16 (la scelta di mm è un compromesso tra intervallo e risoluzioneil più piccolo passo tra due valori rappresentabili consecutivi):

Formato Intervallo Risoluzione
0.16 U [0; 1)[0;\,1) 1,53⋅10−51{,}53\cdot10^{-5}
1.15 U [0; 2)[0;\,2) 3,05⋅10−53{,}05\cdot10^{-5}
2.14 U [0; 4)[0;\,4) 6,10⋅10−56{,}10\cdot10^{-5}
4.12 U [0; 16)[0;\,16) 2,44⋅10−42{,}44\cdot10^{-4}
8.8 U [0; 256)[0;\,256) 3,91⋅10−33{,}91\cdot10^{-3}
1.15 S (Q15) [−1; 1)[-1;\,1) 3,05⋅10−53{,}05\cdot10^{-5}
2.14 S [−2; 2)[-2;\,2) 6,10⋅10−56{,}10\cdot10^{-5}
3.13 S [−4; 4)[-4;\,4) 1,22⋅10−41{,}22\cdot10^{-4}
8.8 S [−128; 128)[-128;\,128) 3,91⋅10−33{,}91\cdot10^{-3}
16.0 S [−32768; 32767][-32768;\,32767] 11 (interi)

Il caso n=0n=0 (U) o n=1n=1 (S) si chiama rappresentazione frazionariaformato in cui i numeri sono frazioni minori di 1 in modulo o Qnformato frazionario in cui la virgola è subito dopo il bit di segno: Q15 coincide con 1.15, Q7 con 1.7: i numeri sono frazioni in [−1,1)[-1,1) e il massimo positivo 1−2−m1-2^{-m} è 7FFF16\texttt{7FFF}_{16} su 16 bit. Per un intero puro si ha m=0m=0 (virgola a destra dell'LSB). Per le parole a 8 bit Q7 vuol dire 1.7, per 16 bit Q15 vuol dire 1.15.

Decodificare: dal codice esadecimale al decimale

Procedura: (1) leggere il codice come intero (per S, se il bit più alto è 1 sottrarre 2W2^W); (2) dividere per 2m2^m.

Esempi su 16 bit.

  • 0xBAAA\texttt{0xBAAA} in 3.13 U: 47786/213=47786/8192=5,83347786/2^{13}=47786/8192=\mathbf{5{,}833}.
  • 0x8ABA\texttt{0x8ABA} in 1.15 S: il bit più alto è 1, quindi 35514−65536=−3002235514-65536=-30022 e −30022/32768=−0,916-30022/32768=\mathbf{-0{,}916}.
  • 0xDF00\texttt{0xDF00} in 2.14 U: 57088/16384=3,48457088/16384=\mathbf{3{,}484}.
  • 0x92AA\texttt{0x92AA} in 9.7 S: 37546−65536=−2799037546-65536=-27990, −27990/128=−218,67-27990/128=\mathbf{-218{,}67}.
  • Lo stesso codice 0x9F68=40808\texttt{0x9F68}=40808 vale in 3.13 S: (40808−65536)/8192=−3,019(40808-65536)/8192=-3{,}019; in 3.13 U: 40808/8192=4,98140808/8192=4{,}981; in 5.11 S: −24728/2048=−12,074-24728/2048=-12{,}074; in 5.11 U: 19,92619{,}926. Cambiando il formato cambia tutto.
  • 0xEF00\texttt{0xEF00} in 8.8 S: 61184−65536=−435261184-65536=-4352, −4352/256=−17-4352/256=\mathbf{-17}.

Errori da evitare quando si somma e si moltiplica

Due insidie sempre presenti:

  1. Somma: i due addendi devono avere lo stesso fattore di scala. Il processore non allinea da solo le virgole. Esempio: 01.0010201.0010_2 (formato 2.4: 18/16=1,12518/16=1{,}125) più 00.1010200.1010_2 (10/16=0,62510/16=0{,}625) dà 01.11002=28/16=1,7501.1100_2=28/16=1{,}75, corretto solo perché le virgole coincidono.
  2. Prodotto: moltiplicando due numeri n1.m1n_1.m_1 e n2.m2n_2.m_2 si ottiene un intero che ha m1+m2m_1+m_2 bit frazionari: il fattore di scala del prodotto è il prodotto dei fattori di scala (per questo, dopo il prodotto, serve un riallineamentospostamento (shift) del risultato per riportarlo allo stesso fattore di scala degli altri dati). Esempio: 18⋅10=180=0000 1011 0100218\cdot10=180=0000\,1011\,0100_2; interpretato con 4 bit frazionari vale 11,2511{,}25 (sbagliato); con 4+4=84+4=8 bit frazionari vale 180/256=0,703=1,125⋅0,625180/256=0{,}703=1{,}125\cdot0{,}625 (corretto).

Questi due punti, con il resto delle operazioni, sono in Operazioni in virgola fissa - somma, prodotto e riallineamentoIn virgola fissa il processore opera sugli interi e non sa dov'è la virgola: tocca al programmatore. Regola 1: si sommano solo dati con lo stesso formato (stesso $m$). Regola 2: il prodotto di $n_1.m_1$ per $n_2.m_2$ ha $m_1+m_2$ bit frazionari e il doppio dei bit: va riallineato con uno shift a destra di $m_2$ posizioni (per riportarlo a $m_1$) o preso dalla parte alta. Con la normalizzazione frazionaria $1.15$ il prodotto è $2.30$ e basta uno shift a sinistra di 1 prima di prendere la parte alta. I fattori di scala si scelgono per evitare overflow e perdita di risoluzione.Operazioni in virgola fissa - somma, prodotto e riallineamento →. Come si sceglie il formato e si calcola l'errore è in Rappresentare un valore reale in virgola fissa - formato ottimo ed errorePer rappresentare un reale $x$ su $W$ bit a virgola fissa si sceglie il formato che minimizza l'erroresceglie la rappresentazione per cui la differenza tra il valore rappresentato e quello vero è la più piccola possibile: il maggior numero di bit frazionari $m$ compatibile con l'intervallo ($n=W-m$ bit interi, con U se $x\ge0$, con S se $x<0$). Poi $C=\mathrm{round}(x\cdot2^m)$, scritto in esadecimale (per un negativo, in complemento a 2), e l'errore $\varepsilon=\frac{C}{2^m}-x$, positivo se in eccesso, ha modulo $\le2^{-(m+1)}$. Se invece è dato l'errore massimo, i bit minimi si ricavano da $2^{-(m+1)}\le\varepsilon_{max}$.Rappresentare un valore reale in virgola fissa - formato ottimo ed errore →.

Altre convenzioni usate in esame

Errori comuni

  • Dimenticare che in un formato S il segno fa parte di nn (1.15 S: un bit di segnoil bit più significativo: vale 1 per i negativi e 15 frazionari, non 16 frazionari).
  • Leggere un codice negativo come naturale (o viceversa) perché si è sbagliata la "S/U".
  • Sommare due numeri con mm diversi senza riallineare.
  • Scambiare Q15 e 0.15: Q15 è 1.15 S (16 bit totali).

Versione ripasso

Esercizi su questo argomento

Teoria collegata