Esercizi · Rappresentazione dei numeri¶
Esercizi · Capitolo 1 · ogni soluzione si apre con un clic · Capitolo 1: Rappresentazione dei numeri · Eserciziario, volume 1 (PDF)
Negli esercizi di questo capitolo i numeri sono rappresentati soltanto con le definizioni e le osservazioni del capitolo «Rappresentazione dei numeri», riassunte dalle seguenti formule.
Numeri naturali con \(k\) cifre in base \(b\):
Numeri interi con \(k\) bit:
Nel complemento a due, la rappresentazione di un \(n\) negativo si ottiene anche invertendo i bit di \(|n|\) e aggiungendo \(1\); una somma va in overflow se e solo se due operandi con lo stesso segno danno un risultato con il bit di segno opposto.
Numeri reali in IEEE 754 a singola precisione (\(1\) bit di segno \(s\), \(8\) bit di esponente polarizzato \(E\), \(23\) bit di parte frazionaria \(f\)), per \(1 \le E \le 254\):
Doppia precisione: \(1 + 11 + 52\) bit, polarizzazione \(1023\).
Esercizio 1.1: Rappresentazione dei numeri (E1)
Si consideri la rappresentazione dei numeri naturali nel sistema binario (base \(b=2\)): intervalli di rappresentazione e numero minimo di cifre.
Domande
-
Calcolare il più grande numero naturale rappresentabile con \(k=6\) cifre in binario e determinare il relativo intervallo di rappresentazione.
-
Per i seguenti valori di \(k\) (numero di cifre), determinare l'intervallo di rappresentazione \([0, b^k-1]\) in base \(b=2\):
\[ k=4, \qquad k=8, \qquad k=10, \qquad k=16 \] -
Determinare il numero minimo di cifre necessarie per rappresentare ciascuno dei seguenti numeri in binario, usando la formula \(\lfloor \log_b n\rfloor +1\):
\[ n=64, \qquad n=128, \qquad n=256, \qquad n=512 \] -
Dati \(k=12\) bit:
-
determinare l'intervallo di rappresentazione;
-
verificare che \(n=2{,}048\) si può rappresentare con \(k=12\) bit;
-
calcolare il numero minimo di bit necessari per rappresentare \(n=2{,}048\).
-
Soluzione
-
Il più grande numero naturale rappresentabile con \(k=6\) cifre in base \(b=2\) è:
\[ b^k - 1 = 2^6 - 1 = 64 - 1 = 63 \]Esso corrisponde alla sequenza binaria \((111111)_2\). Il relativo intervallo di rappresentazione è:
\[ [0, 2^6 - 1] = [0, 63] \] -
Intervalli di rappresentazione per i diversi valori di \(k\):
\[\begin{align*} k=4: &\quad [0, 2^4-1] = [0, 16-1] = [0, 15]\\[1ex] k=8: &\quad [0, 2^8-1] = [0, 256-1] = [0, 255]\\[1ex] k=10: &\quad [0, 2^{10}-1] = [0, 1{,}024-1] = [0, 1{,}023]\\[1ex] k=16: &\quad [0, 2^{16}-1] = [0, 65{,}536-1] = [0, 65{,}535] \end{align*}\] -
Il numero minimo di cifre per ciascun numero:
\[\begin{align*} n=64 = 2^6: &\quad \lfloor \log_2 64\rfloor +1 = \lfloor 6 \rfloor +1 = 6 + 1 = 7\\[1ex] n=128 = 2^7: &\quad \lfloor \log_2 128\rfloor +1 = \lfloor 7 \rfloor +1 = 7 + 1 = 8\\[1ex] n=256 = 2^8: &\quad \lfloor \log_2 256\rfloor +1 = \lfloor 8 \rfloor +1 = 8 + 1 = 9\\[1ex] n=512 = 2^9: &\quad \lfloor \log_2 512\rfloor +1 = \lfloor 9 \rfloor +1 = 9 + 1 = 10 \end{align*}\]Per le potenze di \(2\), cioè \(n=2^m\), si ha \(\log_2 n = m\), e quindi il numero minimo di bit è \(m+1\).
-
Per \(k=12\) bit:
-
l'intervallo di rappresentazione è:
\[ [0, 2^{12}-1] = [0, 4{,}096-1] = [0, 4{,}095] \] -
poiché \(n=2{,}048 = 2^{11}\) e \(2{,}048 \le 4{,}095\), si ha \(2{,}048 \in [0, 4{,}095]\): il numero \(n=2{,}048\) si può rappresentare con \(k=12\) bit;
-
il numero minimo di bit necessari per rappresentare \(n=2{,}048 = 2^{11}\) è:
\[ \lfloor \log_2 2{,}048\rfloor +1 = \lfloor 11 \rfloor +1 = 12 \]
Servono esattamente \(12\) bit per rappresentare \(2{,}048 = 2^{11}\), perché la sua rappresentazione binaria è una cifra \(1\) seguita da undici cifre \(0\):
\[ 2{,}048 = (100000000000)_2 \] -
Esercizio 1.2: Rappresentazione dei numeri (E2)
Si considerino gli intervalli di rappresentazione e il numero minimo di cifre dei numeri naturali nel sistema binario (base \(b=2\)).
Domande
-
Completare la seguente tabella degli intervalli di rappresentazione in binario:
\(k\) (cifre) \(b\) (base) \(b^k-1\) intervallo di rappresentazione 5 2 8 2 10 2 12 2 -
Per ogni numero naturale \(n\) della tabella seguente, calcolare il numero minimo di cifre necessarie per rappresentarlo in base \(b=2\), usando la formula \(\lfloor \log_b n\rfloor +1\):
\(n\) \(b\) \(\log_b n\) \(\lfloor \log_b n\rfloor +1\) 7 2 15 2 31 2 100 2 255 2 -
Usando la relazione tra byte e bit, completare la tabella:
byte bit (\(k\)) \(2^k\) intervallo di rappresentazione 1 8 \(2^8=256\) \([0,255]\) 2 4 -
Convertire \((11011011)_2\) in base dieci, scrivendo la somma completa \(\sum_{i=0}^{k-1} d_i \cdot 2^i\).
Soluzione
-
Intervalli di rappresentazione in binario:
\(k\) (cifre) \(b\) (base) \(b^k-1\) intervallo di rappresentazione 5 2 \(2^5-1=31\) \([0,31]\) 8 2 \(2^8-1=255\) \([0,255]\) 10 2 \(2^{10}-1=1{,}023\) \([0,1{,}023]\) 12 2 \(2^{12}-1=4{,}095\) \([0,4{,}095]\) -
Numero minimo di cifre per ciascun numero naturale:
\(n\) \(b\) \(\log_b n\) \(\lfloor \log_b n\rfloor +1\) 7 2 \(\log_2 7 \approx 2.807\) \(\lfloor 2.807 \rfloor +1 = 3\) 15 2 \(\log_2 15 \approx 3.907\) \(\lfloor 3.907 \rfloor +1 = 4\) 31 2 \(\log_2 31 \approx 4.954\) \(\lfloor 4.954 \rfloor +1 = 5\) 100 2 \(\log_2 100 \approx 6.644\) \(\lfloor 6.644 \rfloor +1 = 7\) 255 2 \(\log_2 255 \approx 7.994\) \(\lfloor 7.994 \rfloor +1 = 8\) Per i numeri della forma \(2^k - 1\) servono esattamente \(k\) bit: \(2^k-1\) è il più grande numero naturale con \(k\) bit.
-
Poiché \(1\) byte \(= 8\) bit:
byte bit (\(k\)) \(2^k\) intervallo di rappresentazione 1 8 \(2^8=256\) \([0,255]\) 2 16 \(2^{16}=65{,}536\) \([0,65{,}535]\) 4 32 \(2^{32}=4{,}294{,}967{,}296\) \([0,4{,}294{,}967{,}295]\) -
La sequenza ha \(k=8\) cifre: \(d_7=1\), \(d_6=1\), \(d_5=0\), \(d_4=1\), \(d_3=1\), \(d_2=0\), \(d_1=1\), \(d_0=1\). Quindi:
\[\begin{align*} (11011011)_2 &= \sum_{i=0}^{7} d_i \cdot 2^i \\ &= d_0 \cdot 2^0 + d_1 \cdot 2^1 + d_2 \cdot 2^2 + d_3 \cdot 2^3 + d_4 \cdot 2^4 + d_5 \cdot 2^5 + d_6 \cdot 2^6 + d_7 \cdot 2^7 \\ &= 1 \cdot 1 + 1 \cdot 2 + 0 \cdot 4 + 1 \cdot 8 + 1 \cdot 16 + 0 \cdot 32 + 1 \cdot 64 + 1 \cdot 128 \\ &= 1 + 2 + 0 + 8 + 16 + 0 + 64 + 128 \\ &= 219 \end{align*}\]Pertanto, \((11011011)_2 = (219)_{10}\).
Esercizio 1.3: Rappresentazione dei numeri (E3)
Si considerino l'enumerazione completa delle sequenze di cifre in binario per un dato numero di bit e la rappresentazione binaria di alcuni numeri naturali.
Domande
-
Completare la tabella di tutte le sequenze di \(k=5\) cifre in binario (base \(2\)) e dei loro valori decimali. Mostrare il calcolo dettagliato almeno per le prime tre e le ultime tre sequenze:
Sequenza di cifre \(b\) \(k\) rappresentazione decimale \((00000)_2\) 2 5 \((00001)_2\) 2 5 \((00010)_2\) 2 5 \((00011)_2\) 2 5 \(\vdots\) \(\vdots\) \(\vdots\) \(\vdots\) \((11101)_2\) 2 5 \((11110)_2\) 2 5 \((11111)_2\) 2 5 -
Quante sequenze diverse sono possibili con \(k=5\) bit? Verificare la risposta con la formula \(b^k\), dove \(b=2\).
-
Trovare la rappresentazione binaria dei seguenti numeri decimali, determinando quali potenze di \(2\) sommano al valore dato:
\[ n=21, \qquad n=50, \qquad n=63 \] -
Per ciascuna sequenza seguente, stabilire se rappresenta una potenza di \(2\) e, in caso affermativo, quale potenza:
\[ (10000)_2, \qquad (10101)_2, \qquad (100000000)_2 \]
Soluzione
-
Tutte le sequenze con \(k=5\) bit:
Sequenza di cifre \(b\) \(k\) rappresentazione decimale \((00000)_2\) 2 5 \((0 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 0 \cdot 2^1 + 0 \cdot 2^0)_{10} = (0)_{10}\) \((00001)_2\) 2 5 \((0 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0)_{10} = (1)_{10}\) \((00010)_2\) 2 5 \((0 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0)_{10} = (2)_{10}\) \((00011)_2\) 2 5 \((3)_{10}\) \((00100)_2\) 2 5 \((4)_{10}\) \((00101)_2\) 2 5 \((5)_{10}\) \((00110)_2\) 2 5 \((6)_{10}\) \((00111)_2\) 2 5 \((7)_{10}\) \((01000)_2\) 2 5 \((8)_{10}\) \((01001)_2\) 2 5 \((9)_{10}\) \(\vdots\) \(\vdots\) \(\vdots\) \(\vdots\) \((11101)_2\) 2 5 \((1 \cdot 2^4 + 1 \cdot 2^3 + 1 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0)_{10} = (29)_{10}\) \((11110)_2\) 2 5 \((1 \cdot 2^4 + 1 \cdot 2^3 + 1 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0)_{10} = (30)_{10}\) \((11111)_2\) 2 5 \((1 \cdot 2^4 + 1 \cdot 2^3 + 1 \cdot 2^2 + 1 \cdot 2^1 + 1 \cdot 2^0)_{10} = (31)_{10}\) -
Il numero totale di sequenze diverse con \(k=5\) bit in base \(b=2\) è:
\[ b^k = 2^5 = 32 \]Infatti, le sequenze vanno da \((00000)_2 = 0\) a \((11111)_2 = 31\), il che dà esattamente \(32\) valori diversi (da \(0\) a \(31\) inclusi).
-
Rappresentazione binaria dei numeri decimali:
-
\(n=21\): cerchiamo le potenze di \(2\) che sommano a \(21\), partendo dalla più grande potenza non maggiore di \(21\):
\[ 21 = 16 + 5 = 16 + 4 + 1 = 2^4 + 2^2 + 2^0 \]Quindi \((21)_{10} = (10101)_2\).
-
\(n=50\):
\[ 50 = 32 + 18 = 32 + 16 + 2 = 2^5 + 2^4 + 2^1 \]Quindi \((50)_{10} = (110010)_2\).
-
\(n=63\):
\[ 63 = 32 + 31 = 32 + 16 + 8 + 4 + 2 + 1 = 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 \]In alternativa, \(63 = 2^6 - 1\) è il più grande numero naturale con \(6\) bit, quindi tutti i suoi \(6\) bit valgono \(1\). Quindi \((63)_{10} = (111111)_2\).
-
-
Potenze di \(2\):
-
\((10000)_2 = 1 \cdot 2^4 + 0 \cdot 2^3 + 0 \cdot 2^2 + 0 \cdot 2^1 + 0 \cdot 2^0 = 2^4 = 16\): è una potenza di \(2\), precisamente \(2^4\).
-
\((10101)_2 = 1 \cdot 2^4 + 0 \cdot 2^3 + 1 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 = 16 + 4 + 1 = 21\): non è una potenza di \(2\) (è la somma di tre potenze di \(2\) diverse).
-
\((100000000)_2 = 1 \cdot 2^8 = 256\): è una potenza di \(2\), precisamente \(2^8\).
Una sequenza in binario rappresenta una potenza di \(2\) se e solo se ha esattamente una cifra uguale a \(1\) e tutte le altre cifre uguali a \(0\).
-
Esercizio 1.4: Rappresentazione dei numeri (E4)
Si consideri la rappresentazione in complemento a due dei numeri interi in binario.
Domande
-
Determinare l'intervallo di rappresentazione degli interi in complemento a due con i seguenti numeri di bit:
\[ k=4, \qquad k=8, \qquad k=16, \qquad k=32 \] -
Completare la seguente tabella con tutte le rappresentazioni in complemento a due con \(k=4\) bit:
Binario Decimale Bit di segno \((0000)_2\) \((0001)_2\) \((0010)_2\) \((0011)_2\) \((0100)_2\) \((0101)_2\) \((0110)_2\) \((0111)_2\) \((1000)_2\) \((1001)_2\) \((1010)_2\) \((1011)_2\) \((1100)_2\) \((1101)_2\) \((1110)_2\) \((1111)_2\) -
Calcolare la rappresentazione in complemento a due di \(-5\) con \(8\) bit in tre passi: (1) rappresentazione binaria di \(5\), (2) inversione di tutti i bit, (3) somma di \(1\).
-
Verificare che con \(k=5\) bit in complemento a due si può rappresentare l'intero \(-16\) ma non l'intero \(16\).
Soluzione
-
Intervalli di rappresentazione, con la formula \([-2^{k-1}, 2^{k-1}-1]\):
\[\begin{align*} k=4: &\quad [-2^{4-1}, 2^{4-1}-1] = [-2^3, 2^3-1] = [-8, 7]\\[1ex] k=8: &\quad [-2^{8-1}, 2^{8-1}-1] = [-2^7, 2^7-1] = [-128, 127]\\[1ex] k=16: &\quad [-2^{16-1}, 2^{16-1}-1] = [-2^{15}, 2^{15}-1] = [-32{,}768,\, 32{,}767]\\[1ex] k=32: &\quad [-2^{32-1}, 2^{32-1}-1] = [-2^{31}, 2^{31}-1] = [-2{,}147{,}483{,}648,\, 2{,}147{,}483{,}647] \end{align*}\] -
Tutte le rappresentazioni in complemento a due con \(k=4\) bit: una sequenza con bit di segno \(1\) e valore naturale \(r\) rappresenta \(r - 16\).
Binario Decimale Bit di segno \((0000)_2\) \(0\) \(0\) (non negativo) \((0001)_2\) \(1\) \(0\) (non negativo) \((0010)_2\) \(2\) \(0\) (non negativo) \((0011)_2\) \(3\) \(0\) (non negativo) \((0100)_2\) \(4\) \(0\) (non negativo) \((0101)_2\) \(5\) \(0\) (non negativo) \((0110)_2\) \(6\) \(0\) (non negativo) \((0111)_2\) \(7\) \(0\) (non negativo) \((1000)_2\) \(8-16=-8\) \(1\) (negativo) \((1001)_2\) \(9-16=-7\) \(1\) (negativo) \((1010)_2\) \(10-16=-6\) \(1\) (negativo) \((1011)_2\) \(11-16=-5\) \(1\) (negativo) \((1100)_2\) \(12-16=-4\) \(1\) (negativo) \((1101)_2\) \(13-16=-3\) \(1\) (negativo) \((1110)_2\) \(14-16=-2\) \(1\) (negativo) \((1111)_2\) \(15-16=-1\) \(1\) (negativo) L'intervallo di rappresentazione con \(4\) bit è \([-8, 7]\).
-
Rappresentazione in complemento a due di \(-5\) con \(8\) bit:
-
Passo 1: rappresentazione binaria di \(5\) con \(8\) bit: \((00000101)_2\).
-
Passo 2: inversione di tutti i bit: \((11111010)_2\).
-
Passo 3: somma di \(1\) (la prima riga contiene i riporti; il riporto sopra una colonna proviene dalla colonna alla sua destra):
riporto 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 somma 1 1 1 1 1 0 1 1
Pertanto, la rappresentazione in complemento a due di \(-5\) con \(8\) bit è \((11111011)_2\). Verifica:
\[ 2^8 - 5 = 256 - 5 = 251 = (11111011)_2 \] -
-
Con \(k=5\) bit l'intervallo di rappresentazione è:
\[ [-2^{5-1}, 2^{5-1}-1] = [-2^4, 2^4-1] = [-16, 15] \]-
Poiché \(-16 \in [-16, 15]\), l'intero \(-16\) si può rappresentare, e la sua rappresentazione è:
\[ 2^5 - 16 = 32 - 16 = 16 = (10000)_2 \] -
Poiché \(16 > 15\), si ha \(16 \notin [-16, 15]\): l'intero \(16\) non si può rappresentare con \(5\) bit in complemento a due.
Il complemento a due rappresenta un intero negativo in più rispetto a quelli positivi, perché l'intervallo \([-2^{k-1}, 2^{k-1}-1]\) è asimmetrico.
-
Esercizio 1.5: Rappresentazione dei numeri (E5)
Si considerino la somma di numeri interi in complemento a due, il rilevamento degli overflow e il confronto tra modulo e segno e complemento a due.
Domande
-
Eseguire le seguenti somme in complemento a due con \(k=5\) bit, mostrando le rappresentazioni binarie e la somma in colonna, e verificare i risultati:
\[ (-7) + 3, \qquad (-8) + 8, \qquad 5 + 6 \] -
Stabilire se si verifica un overflow nelle seguenti somme con \(k=5\) bit, e spiegarne il motivo:
\[ 7 + 7, \qquad (-8) + (-8), \qquad 7 + (-8), \qquad 9 + 8 \] -
Confrontare le rappresentazioni in modulo e segno e in complemento a due con \(k=4\) bit:
-
qual è l'intervallo di rappresentazione di ciascuna?
-
quante rappresentazioni ha lo zero in ciascun sistema?
-
quale sistema è migliore per le operazioni aritmetiche, e perché?
-
-
Con \(k=8\) bit in complemento a due, calcolare le rappresentazioni di \(-64\) e \(-128\), usando la formula \(2^k + n\) per gli interi negativi \(n\).
Soluzione
Nelle somme in colonna, la prima riga contiene i riporti: il riporto scritto sopra una colonna proviene dalla colonna alla sua destra, e la colonna più a sinistra riceve il riporto uscente dalla posizione più significativa, che viene scartato.
-
Con \(k=5\) bit l'intervallo di rappresentazione è \([-16, 15]\).
-
\((-7) + 3 = -4\). Rappresentazioni: \(-7 \rightarrow 2^5 - 7 = 25 = (11001)_2\) e \(3 = (00011)_2\).
riporto 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 somma 0 1 1 1 0 0 Il risultato \((11100)_2\) ha valore naturale \(28\), quindi rappresenta \(28 - 32 = -4\).
-
\((-8) + 8 = 0\). Rappresentazioni: \(-8 \rightarrow 2^5 - 8 = 24 = (11000)_2\) e \(8 = (01000)_2\).
riporto 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 somma 1 0 0 0 0 0 Il risultato è \((00000)_2 = 0\).
-
\(5 + 6 = 11\). Rappresentazioni: \(5 = (00101)_2\) e \(6 = (00110)_2\).
riporto 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 somma 0 0 1 0 1 1 Il risultato è \((01011)_2 = 11\).
-
-
Rilevamento dell'overflow con \(k=5\) bit (intervallo \([-16, 15]\)):
-
\(7 + 7\) (atteso \(14\)). Rappresentazioni: \(7 = (00111)_2\).
riporto 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 somma 0 0 1 1 1 0 Risultato: \((01110)_2 = 14\): entrambi gli operandi sono positivi e il risultato è positivo: nessun overflow (\(14 \le 15\)).
-
\((-8) + (-8)\) (atteso \(-16\)). Rappresentazioni: \(-8 \rightarrow 2^5 - 8 = 24 = (11000)_2\).
riporto 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 somma 1 1 0 0 0 0 Risultato: \((10000)_2 = -16\): entrambi gli operandi sono negativi e il risultato è negativo: nessun overflow (\(-16 \ge -16\)). Il riporto uscente viene scartato.
-
\(7 + (-8)\) (atteso \(-1\)). Rappresentazioni: \(7 = (00111)_2\) e \(-8 \rightarrow 2^5 - 8 = 24 = (11000)_2\).
riporto 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 somma 0 1 1 1 1 1 Risultato: \((11111)_2 = -1\): gli operandi hanno segni diversi, quindi non può verificarsi un overflow.
-
\(9 + 8\) (atteso \(17\)). Rappresentazioni: \(9 = (01001)_2\) e \(8 = (01000)_2\).
riporto 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 somma 0 1 0 0 0 1 Risultato: \((10001)_2 = -15\): entrambi gli operandi sono positivi, ma il risultato ha bit di segno \(1\): overflow. Infatti \(9 + 8 = 17 > 15\) non si può rappresentare con \(5\) bit.
Regola: si ha overflow solo quando si sommano due interi con lo stesso segno e il risultato ha il bit di segno opposto.
-
-
Confronto tra modulo e segno e complemento a due con \(k=4\) bit:
-
intervalli di rappresentazione:
\[\begin{align*} \text{modulo e segno:} &\quad [-(2^{4-1}-1),\, 2^{4-1}-1] = [-7, 7]\\[1ex] \text{complemento a due:} &\quad [-2^{4-1},\, 2^{4-1}-1] = [-8, 7] \end{align*}\]il complemento a due rappresenta un intero in più, \(-8\);
-
il modulo e segno ha due rappresentazioni dello zero, \((0000)_2 = +0\) e \((1000)_2 = -0\); il complemento a due ne ha una sola, \((0000)_2 = 0\);
-
il complemento a due è migliore per le operazioni aritmetiche, perché:
-
lo zero ha una rappresentazione unica;
-
somma e sottrazione si eseguono come per i numeri naturali (modulo \(2^k\)), con gli stessi circuiti usati per i numeri senza segno;
-
il bit di segno non richiede un trattamento speciale, quindi i circuiti sono più semplici ed efficienti.
-
-
-
Rappresentazioni con \(k=8\) bit:
\[\begin{align*} -64: &\quad 2^k + n = 2^8 + (-64) = 256 - 64 = 192 = (11000000)_2\\[1ex] -128: &\quad 2^k + n = 2^8 + (-128) = 256 - 128 = 128 = (10000000)_2 \end{align*}\]L'intero \(-128 = -2^{8-1}\) è il più piccolo intero rappresentabile con \(8\) bit in complemento a due.
Esercizio 1.6: Rappresentazione dei numeri (E6)
Si consideri la rappresentazione dei numeri reali in virgola mobile, secondo lo standard IEEE 754.
Domande
-
Scrivere il numero reale \(13.25\) in binario e in notazione scientifica binaria normalizzata, e fornire i suoi \(32\) bit in IEEE 754 a singola precisione.
-
Determinare il numero reale rappresentato dai seguenti \(32\) bit in IEEE 754 a singola precisione:
\[ 0~~01111100~~01000000000000000000000 \] -
Usando il formato a doppia precisione (\(1\) bit di segno, \(11\) bit di esponente con polarizzazione \(1023\), \(52\) bit di parte frazionaria), calcolare il più grande numero finito e il più piccolo numero normalizzato positivo. I valori \(E = 0\) e \(E = 2^{11}-1 = 2{,}047\) dell'esponente polarizzato sono riservati.
-
In doppia precisione, sommare dieci volte il numero \(0.1\) a una variabile inizializzata a \(0\) dà \(0.99999999999999989\) e non \(1\). Spiegare perché.
Soluzione
-
Rappresentazione di \(13.25\):
-
Passo 1 (binario): \(13.25 = 8 + 4 + 1 + 0.25 = 1 \cdot 2^3 + 1 \cdot 2^2 + 0 \cdot 2^1 + 1 \cdot 2^0 + 0 \cdot 2^{-1} + 1 \cdot 2^{-2}\), quindi:
\[ 13.25 = (1101.01)_2 \] -
Passo 2 (normalizzazione): la virgola si sposta di tre posizioni a sinistra:
\[ (1101.01)_2 = (1.10101)_2 \cdot 2^3 \]quindi \(s = 0\), \(e = 3\) e la parte frazionaria inizia con \(10101\).
-
Passo 3 (esponente polarizzato): \(E = e + 127 = 130 = 128 + 2 = (10000010)_2\).
-
Passo 4 (parte frazionaria): \(10101\) completato con zeri fino a \(23\) bit.
I \(32\) bit sono:
\[ \underbrace{0}_{s}~~\underbrace{10000010}_{E}~~\underbrace{10101000000000000000000}_{f} \] -
-
Lettura dei \(32\) bit:
-
Passo 1 (segno): \(s = 0\), il numero è positivo.
-
Passo 2 (esponente): \(E = (01111100)_2 = 64 + 32 + 16 + 8 + 4 = 124\), quindi \(e = E - 127 = -3\).
-
Passo 3 (mantissa): \((1.01)_2 = 1 + 0.25 = 1.25\).
-
Passo 4 (valore):
\[ x = (-1)^0 \cdot 1.25 \cdot 2^{-3} = \frac{1.25}{8} = 0.15625 \]
-
-
In doppia precisione un numero normalizzato è \((-1)^s \cdot (1.f_1 f_2 \dots f_{52})_2 \cdot 2^{E - 1023}\) con \(1 \le E \le 2{,}046\).
-
Il più grande numero finito ha \(E = 2{,}046\), cioè \(e = 1{,}023\), e tutti i \(52\) bit della parte frazionaria uguali a \(1\), cioè mantissa \(\sum_{i=0}^{52} 2^{-i} = 2 - 2^{-52}\):
\[ (2 - 2^{-52}) \cdot 2^{1023} \approx 1.7976931349 \times 10^{308} \] -
Il più piccolo numero normalizzato positivo ha \(E = 1\), cioè \(e = -1{,}022\), e tutti i bit della parte frazionaria uguali a \(0\):
\[ 1 \cdot 2^{-1022} \approx 2.2250738585 \times 10^{-308} \]
-
-
Il numero decimale \(0.1\) ha una rappresentazione binaria infinita:
\[ 0.1 = (0.0\,0011\,0011\,0011\dots)_2 = (1.1001\,1001\,1001\dots)_2 \cdot 2^{-4} \]quindi la sua parte frazionaria non entra in \(52\) bit e viene arrotondata. Il numero effettivamente memorizzato è leggermente diverso da \(0.1\):
\[ 0.1000000000000000055511151231\dots \]Inoltre, il risultato di ogni somma viene arrotondato di nuovo al più vicino numero rappresentabile in doppia precisione. I dieci errori di arrotondamento si accumulano, e il risultato finale non è \(1\) ma:
\[ 0.99999999999999989 \]Per questo motivo, due numeri in virgola mobile non vanno confrontati con l'operatore di uguaglianza senza cautela.