Salta al contenuto
Note per Studenti Rappresentare un valore reale in virgola fissa - formato ottimo ed errore

Rappresentare un valore reale in virgola fissa - formato ottimo ed errore

In questa pagina 5
**: il maggior numero di bit frazionari mm compatibile con l'intervallo (n=W−mn=W-m bit interi, con **U** se x≥0x\ge0, con **S** se x<0x<0). Poi C=round(x⋅2m)C=\mathrm{round}(x\cdot2^m), scritto in esadecimale (per un negativo, in complemento a 2), e l'errore ε=C2m−x\varepsilon=\frac{C}{2^m}-x, **positivo se in eccesso**, ha modulo ≤2−(m+1)\le2^{-(m+1)}. Se invece è dato l'errore massimo, i bit minimi si ricavano da 2−(m+1)≤εmax2^{-(m+1)}\le\varepsilon_{max}. -->

Questa nota risponde alla domanda tipica dell'esame: "convertire questi numeri frazionari in valori esadecimali a quattro cifre, arrotondando e normalizzando nel modo più conveniente, cioè minimizzando l'errore introdotto". Il formato n.m è definito in 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 →; qui si impara a sceglierlo.

Il metodo in cinque passi

Dato xx e la lunghezza di parolanumero di bit con cui il processore rappresenta un dato WW (16 negli esempi):

  1. Segno. Se x≥0x\ge0 conviene U (senza segnoil bit più alto di un numero in complemento a 2: 1 vuol dire negativo): il bit di segno risparmiato diventa un bit in più di precisione. Se x<0x<0 serve S (con segno).
  2. Bit interi nn. Il minimo nn tale che ∣x∣|x| entri nell'intervalloinsieme dei valori rappresentabili, tra il minimo e il massimo: per U x<2nx<2^n; per S −2n−1≤x<2n−1-2^{n-1}\le x<2^{n-1} (in S, n≥1n\ge1 perché c'è il segno).
  3. Bit frazionari m=W−nm=W-n: più è grande mm, più è piccolo l'errore, quindi si usa tutto quello che avanza.
  4. Codice C=round(x⋅2m)C=\mathrm{round}(x\cdot2^m); per un negativo si scrive in complemento a 2codifica dei numeri con segno su W bit: si somma 2 elevato a W al valore negativo: C mod 2WC\bmod2^W. Poi si scrive in esadecimalesistema in base 16: ogni cifra vale 4 bit (4 bit per cifra).
  5. Errore ε=C2m−x\varepsilon=\dfrac{C}{2^m}-x (il valore rappresentato meno il vero): è positivo se il numero rappresentato è in eccesso; vale ∣ε∣≤2−(m+1)|\varepsilon|\le2^{-(m+1)}, e zero se xx è multiplo dinumero che si ottiene moltiplicando per un intero 2−m2^{-m}.

Perché non usare sempre molti bit frazionari? Perché i bit interii bit che stanno prima della virgola, segno compreso se il numero è con segno servono per non uscire dall'intervallo: con m=15m=15 (1.15 S) il massimo è meno di 1 e un numero come 1,61{,}6 non entra (andrebbe in overflowvalore fuori dall'intervallo rappresentabile: il codice si avvolge e il numero risulta sbagliato). Si prende il formato con meno bit interi che contiene il numero.

Esempi svolti (su 16 bit)

+8/11=0,72727+8/11=0{,}72727. Positivo e minore di 1: 0.16 U, m=16m=16. C=round(0,72727⋅65536)=round(47662,5)=47663=0xBA2FC=\mathrm{round}(0{,}72727\cdot65536)=\mathrm{round}(47662{,}5)=47663=\texttt{0xBA2F}. Rappresentato =47663/65536=0,727279=47663/65536=0{,}727279; ε=+6,9⋅10−6\varepsilon=+6{,}9\cdot10^{-6}.

−8/11-8/11. Negativo e in modulo minore di 1: 1.15 S, m=15m=15. C=round(−0,72727⋅32768)=−23831C=\mathrm{round}(-0{,}72727\cdot32768)=-23831; in complemento a 2: 65536−23831=41705=0xA2E965536-23831=41705=\texttt{0xA2E9}. ε=+8,3⋅10−6\varepsilon=+8{,}3\cdot10^{-6}.

−123,34-123{,}34. Serve ∣x∣<2n−1|x|<2^{n-1} con n−1=7n-1=7 (27=1282^7=128): 8.8 S. C=round(−123,34⋅256)=−31575C=\mathrm{round}(-123{,}34\cdot256)=-31575; 65536−31575=33961=0x84A965536-31575=33961=\texttt{0x84A9}; ε=+1,56⋅10−4\varepsilon=+1{,}56\cdot10^{-4}.

+1,625+1{,}625. Positivo, tra 1 e 2: 1.15 U. C=1,625⋅32768=53248=0xD000C=1{,}625\cdot32768=53248=\texttt{0xD000}. 1,625=13/81{,}625=13/8 è multiplo di 2−32^{-3}, quindi ε=0\varepsilon=0 (rappresentazione esatta).

+4/3+4/3 e −4/3-4/3. +4/3=1,3333+4/3=1{,}3333: 1.15 U, C=43691=0xAAABC=43691=\texttt{0xAAAB}, ε=+1,0⋅10−5\varepsilon=+1{,}0\cdot10^{-5}. −4/3-4/3: negativo tra −1-1 e −2-2: 2.14 S, C=round(−1,3333⋅16384)=−21845→65536−21845=43691=0xAAABC=\mathrm{round}(-1{,}3333\cdot16384)=-21845\to65536-21845=43691=\texttt{0xAAAB} (stesso codice del positivo, ma letto in un altro formato!), ε=+2,0⋅10−5\varepsilon=+2{,}0\cdot10^{-5}.

+8,625+8{,}625 e −1,75-1{,}75. 8,625=69/88{,}625=69/8: 4.12 U (8,625<168{,}625<16), C=8,625⋅4096=35328=0x8A00C=8{,}625\cdot4096=35328=\texttt{0x8A00}, errore nullo. −1,75-1{,}75: 2.14 S, C=−28672→0x9000C=-28672\to\texttt{0x9000}, errore nullo.

14/9=1,555614/9=1{,}5556 (set 2026): 1.15 U, 0xC71C\texttt{0xC71C}, ε=−1,36⋅10−5\varepsilon=-1{,}36\cdot10^{-5}. −0,1357-0{,}1357: 1.15 S, 0xEEA1\texttt{0xEEA1}, ε=−1,2⋅10−5\varepsilon=-1{,}2\cdot10^{-5}. +3,275+3{,}275: 2.14 U, 0xD19A\texttt{0xD19A}, ε=+2,4⋅10−5\varepsilon=+2{,}4\cdot10^{-5}. −9,922-9{,}922: 5.11 S, 0xB0A0\texttt{0xB0A0}, ε=+1,25⋅10−4\varepsilon=+1{,}25\cdot10^{-4}.

Si nota che il segno del numero decide anche quanti bit frazionarii bit che stanno dopo la virgola: dopo la scalatura pesano 2 elevato a meno 1, meno 2, e così via restano: +8/11+8/11 ha m=16m=16, −8/11-8/11 solo m=15m=15.

Troncamento invece di arrotondamento

Il troncamento scarta i bit meno significativi senza arrotondare: l'errore è sempre dello stesso segno e può arrivare a 2−m2^{-m}, il doppio dell'errore massimo di arrotondamentosostituzione del valore con il più vicino rappresentabile. Per la modalità "troncamentoeliminazione dei bit meno significativi senza arrotondare del modulo" l'errore è per un positivo ≤0\le0 (si rappresenta meno del vero): per 0,1230{,}123 in Q7, C=⌊15,7⌋=15C=\lfloor15{,}7\rfloor=15, rappresentato 15/128=0,117215/128=0{,}1172, ε=−5,8⋅10−3\varepsilon=-5{,}8\cdot10^{-3}. Per un negativo il troncamento del modulo dà errore positivo: −0,567→−72/128=−0,5625-0{,}567\to-72/128=-0{,}5625, ε=+4,5⋅10−3\varepsilon=+4{,}5\cdot10^{-3} (invece lo scarto dei bit in complemento a 2 equivale a ⌊⋅⌋\lfloor\cdot\rfloor e va verso −∞-\infty). L'arrotondamento ha errore medio nullo, il troncamento no: per questo si preferisce l'arrotondamento (e, nel caso "esattamente a metà", l'arrotondamento convergentearrotondamento al pari nel caso di valore esattamente a metà tra due codici: Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamentoL'architettura è l'insieme delle risorse visibili al programmatore (istruzioni, modi di indirizzamento). RISC: poche istruzioni semplici, di uguale lunghezza, decodifica cablata, quasi tutte a 1 ciclo; CISC: molte istruzioni complesse, decodifica microprogrammata, più cicli. I DSP sono RISC "potenziati" (MAC, saturazione, barrel shifter, arrotondamento, VLIW, SIMD); i modi di indirizzamento tipici sono immediato, a registro, diretto, indiretto, con auto-incremento, circolare e a bit rovesciati (per la FFT).Architettura del repertorio di istruzioni - RISC, CISC, VLIW e indirizzamento →).

Quanti bit servono per un errore assegnato

Se è dato l'errore massimo εmax\varepsilon_{max} (per esempio 50 ppmparti per milione: 50 ppm sono 5 per 10 alla meno 5 =5⋅10−5=5\cdot10^{-5}) si cerca il minimo numero di bit totali W=n+mW=n+m tale che l'errore effettivo sia minore di εmax\varepsilon_{max}. Il limite 2−(m+1)≤εmax2^{-(m+1)}\le\varepsilon_{max} dà m≥log⁡212εmaxm\ge\log_2\frac1{2\varepsilon_{max}} (m≥13,3m\ge13{,}3 per 5⋅10−55\cdot10^{-5}), ma l'errore effettivo dipende dal numero e quindi va verificato:

  • x=13x=\frac13: con m=12m=12, C=1365C=1365, ε=8,1⋅10−5\varepsilon=8{,}1\cdot10^{-5} (troppo); con m=13m=13, C=2731C=2731, ε=4,1⋅10−5\varepsilon=4{,}1\cdot10^{-5} ✓. U con n=0n=0: W=13W=13 bit.
  • x=23,57x=23{,}57: serve n=5n=5 (U, 23,57<3223{,}57<32); con m=13m=13 (W=18W=18) C=193085C=193085 e ε=−5,4⋅10−5\varepsilon=-5{,}4\cdot10^{-5} (supera 5⋅10−55\cdot10^{-5}); con m=14m=14 (W=19W=19) C=386171C=386171 e ε=+7,3⋅10−6\varepsilon=+7{,}3\cdot10^{-6} ✓. Quindi W=19W=19 bit, anche se la formula m≥13,3m\ge13{,}3 avrebbe fatto sperare in m=13m=13: l'errore effettivo va sempre verificato.
  • x=−31,125=−2498x=-31{,}125=-\frac{249}8: multiplo di 2−32^{-3}, quindi m=3m=3 basta con errore nullo; servono n=6n=6 bit (S, intervallo [−32,32)[-32,32)): W=9W=9.

Morale: per i numeri "periodicicon infinite cifre ripetute dopo la virgola, come 1/3 in decimale e binario" in binario (13\frac13, 811\frac8{11}, 23,5723{,}57) servono molti bit; per i numeri con denominatore potenza di 2 (31,12531{,}125, 1,6251{,}625) bastano pochissimi bit.

Errori comuni

  • Usare S per un positivo: si perde un bit.
  • Scegliere nn senza controllare che xx entri nell'intervallo (soprattutto per il limite superiore di S, che è 2n−12^{n-1} escluso).
  • Dimenticare il complemento a 2 per i negativi (scrivere il modulo in esadecimale).
  • Confondere il segno dell'errore: positivo se il valore rappresentato è più grande del vero.

Versione ripasso

Esercizi su questo argomento

Teoria collegata