Numerazione Binaria

Esistono 10 tipi di persone al mondo… Quelle che capiscono il binario e quelle che non lo capiscono. Anonimo1

Rappresentazione posizionale

Nella rappresentazione posizionale, un numero viene scritto come una sequenza di cifre il cui valore assoluto dipende dalla loro posizione. A seconda della posizione infatti la cifra moltiplica una potenza di un numero chiamato base. La numerazione decimale è la rappresentazione posizionale con cui si scrivono comunemente i numeri ed è chiamata così perché utilizza potenze di 10. La cifra che moltiplica la potenza più alta viene detta "cifra più significativa", in inglese "Most Significant Digit" o MSD, mentre la cifra relativa alla potenza più piccola viene detta "cifra meno significativa", in inglese "Less Significant Digit" o LSD.

Ad esempio, il numero 23765 è esprimibile come
2 x 104 + 3 x 103 + 7 x 102 + 6 x 101 + 5 x 100 = 20000 + 3000 + 700 + 60 + 5
La cifra più significativa è il 2, mentre quella meno significativa è il 5.

Generalizzando, data una base B un numero può essere scritto con la rappresentazione posizionale come

(1)
\begin{align} \sum_n M_n B^n \end{align}

dove Mn è l'n-esima cifra, $0 \leq M \leq (B-1)$ e B è la base.

Nell'esempio precedente si ha:
M0 = 5; M1 = 6; M2 = 7; M3 = 3; M4 = 2; Mn = 0 per $n \geq 5$

Si può considerare un qualunque numero maggiore o uguale a 2 come base. La base più piccola possibile è proprio 2 e viene utilizzata dalla numerazione binaria. Le cifre possono essere 0 o 1, perché B-1=1 e si usano potenze di 2. Una cifra nel sistema binario è detta bit, che deriva dall'inglese "binary digit".

Un numero binario come 100101 rappresenta il seguente numero decimale:
1 x 25 + 0 x 24 + 0 x 23 + 1 x 22 + 0 x 21 + 1 x 20 = 32 + 4 + 1 = 37

Poiché la cifra può essere solo 1 o 0, di fatto non devono essere eseguite moltiplicazioni, ma solo somme delle potenze di 2. Analogamente alla numerazione decimale, la cifra che moltiplica la potenza di 2 più grande viene detta bit più significativo, in inglese "Most Significant Bit" o MSB mentre quella che moltiplica quella più piccola viene detta bit meno significativo, in inglese "Less Significant Bit" o LSB.

Nell'informatica è frequente anche la numerazione esadecimale, con base B = 16 e ottale, con base B = 8. Per distinguerli dalla numerazione in base 10 si può indicare la base sotto forma di pedice a destra del numero. Nella programmazione si utilizza un prefisso. Per la numerazione esadecimale il prefisso è "0x", mentre per quella ottale è "0". Nel caso della numerazione esadecimale le cifre variano da 0 a 15. Poiché é necessario, per evitare confusione, che ogni cifra sia rappresentata da un solo simbolo, si è scelto di utilizzare le lettere dell'alfabeto per le cifre che hanno valori compresi tra 10 e 15. Quindi le cifre per la numerazione esadecimale sono:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Per la numerazione ottale, le cui cifre variano da 0 a 7 non è necessario questo espediente. Il numero esadecimale A4F16 (0xA4F) rappresenta il numero decimale seguente:

10 x 162 + 4 x 161 + 15 x 160 = 10 x 256 + 4 x 16 + 15 = 2639

Il numero ottale 1528 (0152) rappresenta il numero decimale seguente:

1 x 82 + 5 x 81 + 2 x 80 = 64 + 5 x 8 + 2 = 106

Rappresentazione a virgola fissa

Si può estendere il concetto alla base della rappresentazione posizionale ai numeri decimali. Infatti, è esattamente quello che si fa quando si scrive un numero decimale. Le cifre dietro alla virgola rappresentano potenze negative della base selezionata.

Ad esempio, il numero 2.856 può essere scritto come:
2 + 8 10-1 + 5 10-2 + 6 10-3 = 2 + 0.8 + 0.05 + 0.006

Nella numerazione binaria, utilizzando la base B = 2, le cifre dietro la virgola sono quindi potenze negative di 2, ovvero:
2-1 = 1/2, 2-2 = 1/4, 2-3 = 1/8, … ecc.

Il numero binario 0.10110 è pari a:
2-1 + 2-3 + 2-4 = 1/2 + 1/8 + 1/16 = 11/16 = 0.6875

Rappresentazione a virgola mobile

Per rappresentare un numero reale in formato binario si ricorre alla cosiddetta rappresentazione a virgola mobile. In questo tipo di rappresentazione, fissati due parametri $\beta$ e p, un numero viene rappresentato come:

(2)
\begin{align} d_0 d_1 ... d_{p-1} \beta^e \end{align}

Dove $\beta$ è la base in cui viene rappresentato (per i numeri binari $\beta$ = 2), e p è detta precisione e corrisponde al numero di cifre di che sono utilizzate. Il numero e viene detto esponente.
Essendo le cifre di in base $\beta$, allora naturalmente si ha:

(3)
\begin{align} 0 \leq d < \beta \end{align}

Il numero binario in virgola mobile 0.1001 22 corrisponde a:
(0.5 + 0.0625) 4 = 2.25
I parametri utilizzati sono: p = 5 e $\beta$ = 2

Data un rappresentazione con parametri p = 3, $\beta$ = 2 ed esponenti compresi tra -1 e 2 si possono rappresentare i seguenti numeri:

0.00 2-1 = 0 0.01 2-1 = 0.125 0.10 2-1 = 0.25 0.11 2-1 = 0.375 1.00 2-1 = 0.5 1.01 2-1 = 0.625 1.10 2-1 = 0.75 1.11 2-1 = 0.875
0.00 20 = 0 0.01 20 = 0.25 0.10 20 = 0.5 0.11 20 = 0.75 1.00 20 = 1 1.01 20 = 1.25 1.10 20 = 1.5 1.11 20 = 1.75
0.00 21 = 0 0.01 21 = 0.5 0.10 21 = 1 0.11 21 = 1.5 1.00 21 = 2 1.01 21 = 2.5 1.10 21 = 3 1.11 21 = 3.5
0.00 22 = 0 0.01 22 = 1 0.10 22 = 2 0.11 22 = 3 1.00 22 = 4 1.01 22 = 5 1.10 22 = 6 1.11 22 = 7

Un numero di dice normalizzato quando la prima cifra (d0) è diversa da 0. Ad esempio la rappresentazione non normalizzata del numero 1 è 0.1 21, mentre quella normalizzata è 1.0 20.

Il problema fondamentale che sorge in questa operazione consiste nel dover rappresentare un insieme continuo di numeri reali (e quindi infinito) attraverso un insieme finito e discreto di sequenze di cifre binarie. Anche l'insieme dei numeri interi è infinito tuttavia, essendo discreto e limitandone l'intervallo di valori ammessi, si ha una rappresentazione esatta. Qualunque intervallo di numeri reali è invece infinito, perché è continuo.
Questo inconveniente implica un arrotondamento nella rappresentazione dei numeri (tranne quelli che sono rappresentati esattamente) al numero a virgola mobile rappresentato esattamente più vicino.

In genere un errore può essere misurato in vari modi: dato un numero x (esatto) rappresentato da un numero x' (che contiene un certo errore a causa di arrotondamenti o imprecisioni), allora si definisce errore assoluto Eass la differenza assoluta tra i due valori:

(4)
\begin{align} E_{ass} = \vert x - x' \vert \end{align}

Si definisce errore relativo Erel il rapporto tra errore assoluto e il valore esatto del numero x:

(5)
\begin{align} E_{rel} = E_{ass} / x = \vert x - x' \vert / x \end{align}

Lo scopo dell'errore relativo consiste nel fornire un valore che rappresenta l'errore in relazione al valore assoluto del numero stesso. Un errore assoluto di 0.2 unità nel numero x = 1 è diverso rispetto allo stesso errore nel numero x = 10000: nel primo caso l'errore incide molto di più nell'incertezza della misurazione, quindi avrà un errore relativo più elevato. Nel primo caso si avrà Erel = 0.2, mentre nel secondo caso Erel = 0.00002.

Standard IEEE-754

Lo standard IEEE-754 descrive alcuni formati di numeri a virgola largamente adottati nell'informatica. Questi formati utilizzano la base binaria ($\beta$ = 2) e impiegano 32 bit o 64 bit per rappresentare un numero. Il formato a 32 bit viene detto a singola precisione, mentre quello a 64 bit a doppia precisione. Essi sono implementati nella maggior parte dei linguaggi di programmazione utilizzati al giorno d'oggi.

In generale, un numero a virgola mobile è costituito da un bit per il segno, x bit per l'esponente e e y bit per il numero, detto mantissa.

Formato a singola precisione - 32 bit

Nel formato a singola precisione l'esponente è costituito da 8 bit, mentre la mantissa da 23 bit, più un bit per il segno. Dal bit 0 (LSB) al bit 22 è presente la mantissa, dal bit 23 al bit 30 l'esponente e nel bit 31 (MSB) il segno.

Se un numero è normalizzato, allora il valore rappresentato dai 32 bit è:
(-1)s 1.d22 d21 … d0 2e
Mentre se è denormalizzato, si ha:
(-1)s d22.d21 … d0 2e

L'esponente è in formato bias, ed essendo ad 8 bit, il valore del bias sarà pari a 2n-1-1 = 127. Quindi il valore corrispondente dell'esponente varia da -2n-1+1 = -127 a 2n-1 = +128, che corrispondono rispettivamente alle sequenze binarie 0 0 0 0 0 0 0 0 (-127) e 1 1 1 1 1 1 1 1 (+128). Tuttavia gli estremi dell'intervallo di valori sono riservati per numeri speciali, quindi per un numero normale il valore massimo ammesso per un esponente è emax=+127 e il minimo è emin=-126.

Valori speciali

Nella seguente tabella sono indicati dei valori speciali che rappresentano particolari quantità.

Mantissa Esponente Valore corrispondente
= 0 e = emin - 1= -127 ± 0 (a seconda del valore del bit del segno s)
≠ 0 e = emin - 1= -127 Numero non normalizzato
= 0 e = emax + 1= +128 ± ∞ (a seconda del valore del bit del segno s)
≠ 0 e = emax + 1= +128 NaN (Not A Number)
qualunque emin = -126 ≤ e ≤ +127 = emax Numero normalizzato

Il minimo valore rappresentabile è quindi quello corrispondente alla mantissa pari a 00000000000000000000001, ed esponente 00000000. In decimale la mantissa rappresenta il numero 2-22 e l'esponente, con bias di -127 è pari a 2-127, quindi il numero corrispondente è min_value = 2-22 2-127 = 2-149 ≅ 1,401298 10-45.

Il massimo valore rappresentabile invece corrisponde ad un valore della mantissa pari a 11111111111111111111111 ed esponente 11111110. In decimale la mantissa è pari a 1 + 2-1 + 2-2 + … + 2-22 e poiché rappresenta una serie geometrica il valore equivale a 2 - 2-22 ≅ 1,9999997615814209. L'esponente è pari a 2127 ≅ 1,701411834604692 10+38 quindi, il valore massimo è max_value ≅ 3,402823 10+38.

Si possono definire le quantità seguenti:

Nome Descrizione Rappresentazione Binaria (segno, esponente, mantissa) Valore decimale
min_value minimo valore rappresentabile, è un numero denormalizzato 0 00000000 00000000000000000000001 1.401298 10-45
min_value_norm minimo valore di un numero normalizzato 0 00000001 00000000000000000000000 1.175494 10-38
max_value massimo valore rappresentabile 0 11111110 11111111111111111111111 3.402823 10+38

I range di valori sono quindi i seguenti:

Valore Tipo
0 < x < min_value Underflow
min_value ≤ x < min_value_norm Numeri denormalizzati
min_value_norm ≤ x < max_value Numeri normalizzati
x > maxvalue Overflow

I range di valori indicati sono limitati ai numeri positivi. La situazione è speculare per i numeri negativi.

Oltre a quelle sono definite anche le seguenti quantità:

Valore Rappresentazione Binaria (segno, esponente, mantissa)
Infinito 0 11111111 00000000000000000000000
Not A Number 0 11111111 d22 d21 … d0

Formato a doppia precisione - 64 bit

Nel formato a doppia precisione l'esponente è costituito da 11 bit e la mantissa da 52 bit, più un bit per il segno. La mantissa varia dal bit 0 (LSB) al bit (51), l'esponente dal bit 52 al bit 62 e il segno nel bit 63 (MSB).

L'esponente di lunghezza n = 11 è in formato bias, il cui valore è 2n-1-1 = 1023. Il valore dell'esponente varia da -2n-1+1 = -1023 a 2n-1 = +1024. Come per la precisione semplice, gli estremi dell'intervallo, ovvero il valore dell'esponente 0 0 0 0 0 0 0 0 0 0 0 che corrisponde a -1023 e l'esponente 1 1 1 1 1 1 1 1 1 1 1 corrispondente a +1024 sono riservati, quindi gli estremi disponibili per gli esponenti varia da emax = +1023 a emin = -1022.

Valori speciali

L'esponente 0 0 0 0 0 0 0 0 0 0 0 viene impiegato per i numeri denormalizzati, quando la mantissa è diversa da 0, e per il numero 0 quando anche la mantissa è pari a 0.

Mantissa Esponente Valore corrispondente
= 0 e = emin - 1= -1023 ± 0 (a seconda del valore del bit del segno s)
≠ 0 e = emin - 1= -1023 Numero non normalizzato
= 0 e = emax + 1= +1024 ± ∞ (a seconda del valore del bit del segno s)
≠ 0 e = emax + 1= +1024 NaN (Not A Number)
qualunque emin = -1022 ≤ e ≤ +1023 = emax Numero normalizzato

Il numero minimo rappresentabile è costituito dal valore della mantissa pari a 0000000…000001 = 2-51 e dal valore dell'esponente pari a 00000…00000 = 2-1023, quindi il valore minimo è circa pari a min_value = 2-51 2-1023 = 2-1074 ≅ 4.94065 10-324.

Il numero minimo normalizzato rappresentabile è costituito dal valore dalla mantissa pari a 0 e dal valore dell'esponente pari a 00000…00001 = 2-1022, quindi è pari circa a minvalue_norm = 2-1022 ≅ 2.22507 10-308.

Il numero massimo rappresentabile è costituito dal valore della mantissa pari a 1111111…111111 = 2 - 2-51 e dal valore dell'esponente pari a 11111…11110 = 21023. Quindi il valore massimo è circa pari a max_value = (2 - 2-51) 21023 ≅ 1.79769 10308.

Nome Descrizione Rappresentazione Binaria (segno, esponente, mantissa) Valore decimale
min_value minimo valore rappresentabile, è un numero denormalizzato 0 00…000 000000000…00000000001 4.94065 10-324
min_value_norm minimo valore di un numero normalizzato 0 00…001 000000000…00000000000 2.22507 10-308
max_value massimo valore rappresentabile 0 11…110 111111111…11111111111 1.79769 10308
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License