Un po` di storia - Roberto Borchia

Transcript

Un po` di storia - Roberto Borchia
Teoria dell’informazione
Rappresentazione dei numeri relativi
L’operazione di sottrazione tra due numeri è solitamente data da minuendo meno sottraendo, dal
punto di vista algebrico può essere considerato equivalente alla somma tra il minuendo ed il
sottraendo cambiato di segno. Pertanto la differenza può essere ricondotta ad una somma se facciamo
ricorso ai numeri negativi. Una rappresentazione particolarmente usata è quella detta in modulo e
segno, con la quale si usa il bit più significativo per individuare il segno, secondo la convenzione
seguente:
- I numeri positivi hanno il bit più significativo pari a 0
- I numeri negativi hanno il bit meno significativo pari ad 1
I rimanenti bit rappresentano il modulo, ovvero il valore assoluto, del numero stesso; questo tipo di
rappresentazione rende necessario aggiungere un bit oltre a quelli necessari per l’usuale
rappresentazione del numero. Ad esempio con un bit possiamo rappresentare tutti i numeri compresi
tra + 7 e - 7. Il difetto, che possiamo vedere dalla tabella seguente, è che esistono due
rappresentazioni dello 0 e precisamente 0 0 0 0 (cioè + 0 ) e 1 0 0 0 ( cioè - 0 ).
Bit relativo al segno Bit relativi al modulo Numero corrispondente
0
111
+7
0
110
+6
Dalla tabella a fianco si
0
101
+5
può osservare come la
0
100
+4
rappresentazione
in
0
011
+3
modulo
e
segno
sia
0
010
+2
efficace ed immediata e
0
001
+1
dia in modo rapido
0
000
+0
l’opportunità all’utente di
1
000
-0
rendersi conto di quale
1
001
-1
numero sta utilizzando
1
010
-2
1
011
-3
1
100
-4
1
101
-5
1
110
-6
1
111
-7
RAPPRESENTAZIONE IN COMPLEMENTO A DUE
Per rappresentare i numeri relativi è molto conveniente ricorrere a questo metodo, anche perché è
decisamente più facile da implementare con circuiti elettronici. Per poter apprendere tale metodo è
necessario acquisire il concetto di complemento alla base, valido per tutti i sistemi e non solo per il
sistema binario.
Dato un sistema di numerazione in base b ed un numero N di n cifre, si definisce complemento del
numero alla base e si indica con N ( b) la differenza tra la potenza ennesima della base ed il numero
dato:
N (b) = b n - N
Consideriamo ad esempio il calcolo del complemento alla base del numero binario N = ( 11001 )2 =
= ( 25 )10 e vediamo come si procede al calcolo del complemento sia nel sistema binario, che nel
sistema decimale.
Nel sistema binario, si ha:
N( 2 ) = 25 - 11001 = 100000 – 11001 = 111
Nel sistema decimale, si ha:
N( 10 ) = 102 – 25 = 100 – 25 = 75
Come può essere utilizzato il complemento, ad esempio nelle operazioni di sottrazione binaria? Basta
osservare che volendo svolgere la sottrazione N2 - N1 , può essere verificato la seguente uguaglianza:
N2 – N1 = N2 + ( b n – N1 ) – b n = N2 + N1( b) – b n
Teoria dell’informazione
Dove è possibile controllare che se si tolgono le parentesi la semplificazione ci riporta all’espressione
di partenza. Vediamo adesso di analizzare il risultato ottenuto, alla fine abbiamo scritto:
N2 – N1 = N2 + N1( b) – b n
cioè la differenza tra due numeri è pari alla somma tra il minuendo ed il complemento alla base del
sottraendo meno la potenza ennesima della base, essendo n il numero di cifre della coppia di numeri
su cui stiamo lavorando. Certamente è da osservare che questo metodo risulta particolarmente
oneroso, tuttavia possono verificarsi dei casi in cui è più facile procedere con il complemento.
Analizziamo adesso due casi particolarmente significativi:
1) Stiamo lavorando con due numeri N1 ed N2 tali che N1 > N2 ,applicando le definizioni precedenti
si ricava:
N2 – N1( b) = N2 - N1 + b n = b n – ( N1 – N2 )= (N1 – N2 )( b)
Cioè otteniamo il complemento di (N1 – N2) che rappresenta correttamente il valore negativo – (N1 –
N2 )
2) stiamo lavorando con due numeri N1 ed N2 tali che N1 < N2 , applicando le definizioni precedenti
si ricava:
N2 + N1( b) = N2 + ( b n – N1 )= N2 – N1 + b n
Cioè otteniamo il risultato corretto N2 – N1 , dopo aver eliminato b n ; questo accade se aggiungiamo
una restrizione ovvero che il numero n delle cifre usate per rappresentare i numeri sia fisso.
Alla luce degli esempi svolti possiamo definire in maniera rigorosa il complemento alla base
nell’ambito dei numeri binari
N2(2) = ( 2 n )2 - N2
n
Dove ( 2 )2 vuol dire semplicemente che la potenza n-esima della base va espressa in binario prima
di procedere, esattamente come abbiamo fatto nell’esempio numerico precedente. Accanto alla
definizione di complemento a due è possibile inserire quella di complemento a uno; si ha:
dato un numero N espresso da n cifre, si definisce complemento ad 1 del numero e si indica con N( 1)
la seguente espressione:
N(1) = ( 2 n – 1 ) – N
Ad esempio se vogliamo determinare il complemento ad 1 del numero ( 1011)2 = ( 11)10 si procede nel
modo seguente:
N( 1 ) = ( 24 – 1 ) – N = ( 10000 – 1 ) – 1011 = 1111 – 1011 = 0100
E’ anche possibile calcolare il complemento ad 1 ed il complemento a 2 di un numero usando un
procedimento decisamente più semplice. Dall’esempio precedente si vede infatti che il complemento
ad 1 del numero assegnato 1011 è dato da 0100 cioè il numero di partenza con 0 al posto di 1 e
viceversa; allora è possibile enunciare la seguente definizione:
Il complemento ad 1 di un numero binario assegnato si ottiene dal numero di partenza scambiando
gli 1 con 0 e viceversa.
Analogamente per quanto riguarda il complemento a due è possibile dare la seguente definizione:
Il complemento a 2 di un numero binario assegnato si ottiene dal numero di partenza, calcolando il
complemento ad 1 di quest’ultimo e poi aggiungendo 1 ovvero
N(2) = N(1) + 1
Effettuando operazioni con i numeri binari abbiamo visto che non è detto sempre che si possa ottenere
un risultato avente un numero di bit pari od inferiore a quello degli operandi; questo può essere un
problema soprattutto quando si sceglie di operare in modo tale da avere sempre un numero di bit
prefissato ( definito campo utilizzato ). I sistemi elettronici digitali funzionano in modo tale da
eliminare in maniera automatica l’eventuale riporto che eccede il campo utilizzato, proprio perché
sono progettati per lavorare con un numero fissato di bit. Se si sommano con lo stesso campo ( cioè
con lo stesso numero di bit fissati ) può sorgere un problema se il risultato ha un numero di bit che
eccede il campo, infatti, in questo caso, il bit più significativo non può essere scartato altrimenti si
otterrebbe un risultato sbagliato.
E’ allora necessario riconoscere questa condizione che prende il nome do OVERFLOW ( superamento
della capacità ); esistono due modi di procedere per verificare l’esistenza dell’overflow:
1) Se i bit più significativi ( MSB Most Significant Bit in Inglese ) dei due operandi sono diversi
allora non vi è overflow, perché i segni sono diversi
2) Se i bit più significativi dei due operandi sono uguali allora, se è uguale anche il MSB del
risultato, c’è overflow.
Teoria dell’informazione
Rappresentazione dei numeri non interi
Rappresentazione in virgola fissa
La posizione della virgola viene stabilita a priori e mantenuta fissa all’interno della cella di memoria
che si sta utilizzando per immagazzinare il numero binario . Il numero binario viene rappresentato
separando parte intera da parte frazionaria e precisamente inserendo la parte intera a sinistra della
virgola e la parte frazionaria a destra della virgola; il segno sarà come al solito il bit più a sinistra. Lo
schema è il seguente:
SEGNO PARTE INTERA , PARTE FRAZIONARIA
Rappresentazione in virgola mobile
Questa rappresentazione è spesso indicata con il suo nome inglese ovvero FLOATING POINT ed è
molto usata per quanto riguarda i numeri binari non interi, perché, permettendo la rappresentazione
con mantissa ed esponente, rende più facile lavorare su tali numeri. Osserviamo che in un qualunque
sistema di numerazione un numero qualsiasi N può essere espresso nella forma:
N=m•be
essendo m la mantissa, e l’esponente e b la base del sistema :Ad esempio nel sistema decimale il
numero 20,52 può essere scritto nel modo seguente:
20,52 = 2052 • 10- 2 = 0,2052 • 102
che, come si può notare, è una rappresentazione esattamente corrispondente alla definizione data. E’
possibile distinguere due casi in particolare:
1) Se la mantissa è tale che ( 1/b ) ≤ m < 1 si ha la cosiddetta forma normalizzata.
2 ) Se la mantissa non appartiene a tale intervallo allora si ha la forma non normalizzata.
Nel nostro esempio la seconda scrittura è quella corrispondente alla forma normalizzata . Visto che il
discorso fatto è valido per tutti i sistemi di numerazione, è possibile anche nel sistema binario
esprimere dei numeri non interi con mantissa ed esponente. Ad esempio se volessimo rappresentare in
virgola mobile il numero binario 1111,101 si può osservare che:
1111,101 = 1111101 • 2–3 = 0,1111101 • 24
L’ultima scrittura rappresenta una forma normalizzata dove si è espresso l’esponente in forma
decimale solo per semplicità, mentre la rappresentazione corretta è con l’esponente anch’esso in
binario: Lo schema della rappresentazione in virgola mobile è il seguente :
segno mantissa segno esponente
Ad esempio potendo disporre di 16 bit per la rappresentazione, potremmo avere 12 bit riservati alla
mantissa ( di cui il primo è il segno ). Volendo rappresentare il numero – 101,01101100, avremo:
-101,01101100 = 0,10101101100 • 23
e quindi :
segno
mantissa
segno
esponente
1
10101101100
0
011
Per quanto riguarda lo svolgimento di operazioni in virgola mobile vediamo in modo particolare
l’addizione, per la quale si procede andando a confrontare gli esponenti degli addendi. Se gli
esponenti sono uguali, l’addizione è data dalla somma delle mantisse; ad esempio volendo effettuare
la somma tra 0,1010 • 22 e 0,0101 • 22 si avrà :
0,1010 +
0,0101 =
0,1111
ovvero il risultato sarà: 0,1111 • 22 .
Se invece gli esponenti sono diversi, per svolgere l’operazione occorre scalare il numero più piccolo
fino a portarlo allo stesso esponente del più grande e dopo eseguire l’addizione delle mantisse. Ad
esempio volendo svolgere la somma tra 0,1001 • 22 e 0,1010 • 21 si può procedere nel modo
seguente:
dapprima è necessario effettuare la trasformazione
0,1010 • 21 = 0,0101 • 22
dopo di che possiamo svolgere la somma delle mantisse
0,1001 +
0,0101 =
0,1110
Teoria dell’informazione
Per quanto riguarda le altre operazioni bisogna osservare che la sottrazione può essere ricondotta ad
un’addizione complementando il sottraendo; per moltiplicazione e divisione si opera lavorando sia
sulle mantisse che sugli esponenti. Le mantisse vengono rispettivamente moltiplicate o divise, mentre
glil esponenti vengono rispettivamente sommati oppure sottratti.
1) Convertire in esadecimale ed ottale i seguenti numeri decimali:
236, 435, 8765, 65536, 64, 876
2) Convertire in binario i seguenti numeri decimali:
32, 54, 16, 48, 254, 123, 445
3) Convertire direttamente in binario i seguenti numeri ottali:
44, 75, 107, 447, 124
4) Convertire direttamente in binario i seguenti numeri esadecimali:
A034, A042, F117, 56B2
5) Convertire direttamente prima in esadecimale e poi in ottale i seguenti numeri binari:
1000111100, 1110011, 1111111100, 110000011, 110010
6) Convertire in decimale i seguenti numeri binari:
11001, 111111, 1001100, 11000111, 1100110
7) Eseguire le seguenti somme in binario:
10000111+ 111001;
100001111011+1011000101
1000000+10000
10001100101+100001
8) Eseguire le seguenti sottrazioni in binario:
100001111-101100
10000101-11101
9) Scrivere in complemento ad 1 e poi in complemento a 2 i seguenti numeri binari
1000111100, 1110011, 1111111100, 110000011, 110010
10) Eseguire i seguenti prodotti tra numeri binari:
10001110x 101
100011110x1001
Teoria dell’informazione
La codifica delle Informazioni
Definizione di codifica
Vediamo di dare una definizione del termine codificare. Ci occupiamo di computer e siamo abituati ad
usarli per fare calcoli, per scrivere, per disegnare o ritoccare fotografie, per giocare, per vedere filmati,
per sentire musica, per viaggiare in Internet e chi più ne ha più ne metta. Un elaboratore elettronico
dunque tratta per noi informazioni di diverso tipo almeno acustiche, visive e numeriche. Ma la
macchina che lavora è sempre la stessa ed usa lo stesso tipo di tecnologia per gestire entità diverse.
Cosa hanno in comune i numeri, le immagini, i suoni ed i testi quando sono rappresentati in un
computer? La risposta è: sono comunque un insieme di bit. Mettiamocelo bene in testa l’elaboratore
in ultima analisi lavora solo con i bit. Ma allora deve esistere un metodo che a partire da
un’immagine crea una serie di bit ed è in grado dalla serie di bit di riprodurla a schermo o di
stamparla. Ma la stessa cosa deve valere per i suoni, per i film in DVD. Partiamo da un’informazione
per noi significativa e la trasformiamo in qualcos’altro che però è in diretta corrispondenza con
l’informazione originaria. Sono i vincoli della tecnologia che utilizziamo che stabiliscono le tecniche
di rappresentazione dell’informazione.
C’è anche un’altra serie di considerazioni che ci interessano nell’operazione di codifica. Un conto è
rappresentare del testo in chiaro da spedire con la posta elettronica e ben altro conto è il trasmettere
dell’informazione segreta cifrata con qualche strano meccanismo. Nel secondo caso si deve fare in
modo che il testo codificato sia leggibile solo possedendo un’opportuna chiave di lettura.
Se avete qualche esperienza di Internet vi sarà capitato di scaricare file “zippati”. Pensate alla
differenza di grandezza tra il file originale non compresso e l’equivalente zippato. Qualcuno si è
inventato una tecnica di rappresentazione dell’informazione per cui la stessa cosa è rappresentata con
meno cifre binarie, però non essendo direttamente leggibile. Di nuovo potrebbe esservi capitato di
avere a che fare con file sonori .mp3, .wav o .mid . Lo stesso brano può essere riprodotto a partire da
tre rappresentazioni diverse con varie qualità ed ampiezze di memoria richieste. Se usate un qualche
programma di grafica potreste aver notato degli strani codici RGB o CMYK per gestire il colore; sono
modi diversi uno pensato per la visualizzazione con il monitor, l’altro per la stampa. Quindi in
generale l’operazione di codifica è definita in funzione di esigenze di ottimizzazione di una qualche
prestazione piuttosto che da esigenze di riservatezza o di sicurezza.
Tecnologia
Informazione
originaria
Sicurezza
Informazione
codificata
Prestazioni
Figura 1 - Il processo di codifica
Ricapitolando il processo di codifica trasforma l’informazione al suo ingresso in modo da
rappresentarla in maniera adatta alla tecnologia usata, tenendo conto di vincoli di riservatezza o
sicurezza oltre a considerazioni di efficienza rispetto ad opportuni criteri di valutazione.
Per analogia pensate anche a delle codifiche non tratte direttamente dal mondo dell’informatica. Il
codice che utilizza bandiere per la segnalazione in mare, il codice Morse che rappresenta l’alfabeto
con sequenze d’impulsi di durata più o meno lunga, il linguaggio a segni dei muti, l’alfabeto muto, il
codice a barre per registrare le informazioni sui prodotti venduti e quindi produrre lo scontrino. Sono
tutti casi in cui si descrive qualcosa usando una forma di rappresentazione diversa.
La ricostruzione dell’informazione originaria si chiama operazione di decodifica. Idealmente la
doppia trasformazione di codifica con la successiva decodifica dovrebbe permettere di ricostruire con
fedeltà l’informazione originaria. Non è detto che ciò avvenga. Si distinguono tecniche lossy e
lossless. Una tecnica di codifica è lossy quando c’è perdita di informazione tra rappresentazione
originaria, quella codificata e dunque quella ricostruita. Viceversa si parla di tecniche lossless se la
versione codificata e quindi la sua ricostruzione è una replica fedele dell’originale. In caso di
codifiche lossy è necessario che la perdita sia trascurabile o comunque accettabile. Notate che le
Teoria dell’informazione
operazioni di codifica dei dati sono in un sistema informatico operazioni di input, mentre le
decodifiche sono operazioni di output. Ovviamente l’informazione d’uscita è una ricostruzione di
quella d’ingresso nel caso in cui non ci sia stata una qualche elaborazione dell’informazione stessa. In
quel caso l’informazione ricostruita deve essere diversa da quella d’ingresso, ma questa è un’altra
storia che va chiarita. Dunque la mia informazione in rappresentazione interna può subire delle
modifiche. Tali modifiche devono avere stretta corrispondenza con modifiche che possono in via
teorica essere fatte sull’informazione originale. Se io posso colorare un disegno devo poterlo colorare
anche sulla sua versione in codice ed il risultato in uscita che ottengo deve essere l’analogo di ciò che
io posso fare in realtà. E’ il primo embrionale esempio di realtà virtuale. In generale oltre alla fedeltà
rappresentativa si richiede alle tecniche di codifica di permettere di conservare lo stesso tipo di
manipolabilità dell’informazione che ho nel mondo reale almeno per le applicazioni in cui la uso.
Una rappresentazione numerica che non permette di fare somme con gli stessi risultati che otterrei con
carta e penna non mi può servire per far calcoli numerici. Potrebbe permettermi di gestire i numeri
delle carte di credito risultando magari in ciò più efficiente di un’altra. Possiamo estendendo questo
esempio introdurre il concetto di efficacia di una rappresentazione dell’informazione. Pensiamo ai
codici cifrati; è un caso in cui il codice segreto dovrà essere difficilmente scopribile, se non addirittura
inviolabile. In questo caso l’efficacia è cruciale. Ma anche nel caso di codici rivelatori o correttori di
errore, che in seguito vedremo, l’efficacia sarà un parametro fondamentale. In sostanza si tratta di
opportune tecniche che, se per qualsiasi ragione il flusso di informazioni binarie viene alterato
(disturbi sulla linea di comunicazione, danneggiamenti di un’apparecchiatura o eventi simili), sono in
grado comunque di ricostruire l’informazione originaria almeno entro certi limiti o quanto meno di
segnalare la perdita di dati.
Nel diagramma sottostante è indicato come le considerazioni sulle codifiche si applichino in generale
anche ai sistemi di comunicazioni digitali (telefonia fissa, telefonia mobile, Tv satellitari sono solo
alcuni esempi). In generale si parla di sistema telematico quando si accoppia l’elaborazione dei dati
con la trasmissione a distanza (il bancomat, Internet, la teleprenotazione, il collegamento tra una
filiale e la sede centrale di un’azienda, il telelavoro..).
Informazione
originaria
Sistema informatico o di
telecomunicazione o
telematico
Ingresso dei dati
Informazione
ricostruita
Uscita dei dati
Figura 2 - Codifica e decodifica dei dati
Prima di entrare nello specifico delle tecniche di codifica eccovi un elenco di ordini di grandezza con
cui classificare l’informazione binaria. L’unità elementare è il bit (0 o 1). Seguono il nibble (4 bit)
usato raramente ed il byte (8 bit). Subito dopo abbiamo la cosiddetta word che rappresenta l’insieme
di bit che una specifica macchina è in grado di elaborare in contemporanea con un’istruzione
elementare. Ripercorrendo la gerarchia dei chip Intel si passa dagli 8 bit dell’8080, ai 16 dell’8086,
80286, ai 32 dell’80386, 80486 ai 64 del Pentium. In realtà il termine non è univoco e si rischia
confusione. I numeri indicati per i processori Intel fanno riferimento all’ampiezza del bus dei dati,
cioè del canale di comunicazione tra memoria e processore. Si parla però anche nel Pentium, nel
classificare alcune operazioni elementari, di word intendendo 16 bit e dbword intendendo 32 bit.
Attenzione quando si parla di word a far chiarezza su ciò che viene inteso in quel contesto.
Proseguendo si incontra il Kbit o Kbyte rispettivamente 210 bit e 210 byte. Si ricorda che 210 equivale
a 1024. Incontriamo poi il Mbit o Mbyte, il Gbit o Gbyte ed infine il Tbit o Tbyte . In questa
gerarchia si procede con potenze del 2 crescenti per un fattore 10. 1 megabit=220 bit, 1 gigabit=230 bit
Teoria dell’informazione
ed 1 terabit=240 bit. Tanto per farci un’idea delle capacità attuali dei supporti di memoria: dischetto
1,44Mb, memoria Ram anche 256 Mb, Cd Rom anche 640 Mb, Hard Disk fino a 40 Gb.
Le codifiche numeriche
Come primo problema reale di codifica cerchiamo di superare i limiti connessi alle rappresentazioni di
numeri reali in binario. In particolare osserviamo come numeri che hanno rappresentazione finita in
decimale, quando vengono trasformati in binario avrebbero bisogno di infinite cifre. Se provate a
convertire 0,2 in binario ottenete un numero periodico: 0,210=0,(0011)2. Non si può con numeri reali
garantire la stessa precisione di calcolo nei due sistemi. E’ ben vero che in alcuni casi 0,2+0,2=0,399
può anche andar bene, però se si tratta di milioni di dollari la questione cambia un attimo. La
soluzione la si trova introducendo la codifica BCD (Bynary Coded Decimal). Semplicemente si
rappresentano le cifre di un generico numero decimale con le corrispondenti configurazioni a 4 bit
binarie. Si scelgono 4 bit perché devo rappresentare 10 diverse entità e vale la disequazione:
23<10<24. Inoltre le configurazioni usano tutti i quattro bit perché per ogni cifra dovrò avere stessa
quantità di memoria. Eccovi il codice:
Decimale
BCD
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
8
1000
9
1001
Avremo dunque: 146= 0001| 0100 | 0110 352= 0011 | 0101 | 0010.
Vediamo come poter effettuare somme in BCD: si convertono i due numeri da sommare e si prova ad
effettuare una semplice somma binaria. Ci si accorgerà che ciò in alcuni casi funziona, in altri no.
Capiremo il perché e come porvi rimedio.
Cominciamo con la seguente somma: 236+151=387 in decimale.
236=0010 | 0011 | 0100 151= 0001 | 0101 | 0001. Incolonno e sommo le rappresentazioni binarie .
Caso numero 1: funziona correttamente
Figura 3
Figura 4
Nel secondo caso il risultato contiene dei punti di domanda, cioè configurazioni fuori dal codice.
Infatti se cercate in tabella 1100 non lo trovate. Esso corrisponde al 12 binario che in modo del tutto
logico ho ottenuto sommando 5 e 7. Proviamo a fare uno strano gioco. Sotto ai due caratteri con il ?
sommiamo un 0110 ( 6 BCD).
11 1111 1
0101 | 1011 | 1100
| 0110 | 0110
0110 | 0010 | 0010
6
2
2
Abbiamo risolto i nostri problemi. Pare che miracolosamente aggiungere 6 ci abbia portato in salvo.
Capiamo cosa si nasconde dietro ciò. Quando sommo in decimale conto fino al nove al massimo e poi
Teoria dell’informazione
genero un riporto. Il riporto in binario a quattro cifre viene generato al superamento del quindici. La
distanza in termini numerici tra il 9 ed il 15 è proprio 6. Allora 9+4= 3 riporto 1 in binario diventa
9+4=13. Superando il 9 come risultato devo, per generare correttamente il riporto, sommare 6 al 9 per
potere ripristinare il conteggio da 0. 9+6+4=19 cioè 16 (il riporto di uno) + 3 il risultato. Quindi
abbiamo scoperto che quando una configurazione del risultato è fuori dal codice basterà sommargli 6
per ottenere il risultato corretto. C’è ancora un’insidia. Consideriamo un terzo esempio.
Caso numero 3: ancora problemi: 198+ 278=476
111 1111
0001 | 1001 | 1000
0010 | 0111 | 1000
0100 | 0001 | 0000
4
1
0
198
278
Notate che stavolta tutte le configurazioni sono entro il codice. Il problema è che sommando ad
esempio 8+8 nella prima cifra abbiamo 16 cioè nell’aritmetica esadecimale 0 con il riporto di 1e non
6 con il riporto di 1 come è corretto in decimale. Quei riporti sottolineati indicano proprio la presenza
di una situazione di errore anche se le cifre sono interpretabili nel codice. Per porvi rimedio basta
ancora una volta sommare 6 alle cifre il cui calcolo ha generato un riporto sul primo bit della prossima
cifra. Infatti:
0100 | 0001 | 0000
| 0110 | 0110
0110 | 0111 | 0110
4
7
6
Analoghe regole di correzione possono essere pensate per le differenze e comunque come sappiamo
le differenze possono essere ricondotte a somme tramite i complementi. L’uso del BCD è talmente
diffuso che i microprocessori contengono come istruzioni elementari in linguaggio macchina la
correzione del risultato per operazioni BCD.
Codici
BCD 8421
Abbiamo già visto il codice BCD 8421: è il codice precedente, dove ogni bit ha lo stesso peso dei bit
nei numeri binari (appunto con pesi 8421):
BCD 2421
Esiste una altro codice BCD, il BCD 2421, dove i 4 bit hanno pesi 2421; questo codice è anche
conosciuto come codice di Aiken.
Teoria dell’informazione
In questo codice, le prime 5 cifre (da 0a 5) sono codificate come il BCD8421, mentre per le successive
sono state scelte combinazioni che non sono altro che il complemento a 1 delle prime 5: il numero 5
viene codificato come complemento a 1 del 4 (4: 0100 ; 5: 1011); il 6 come complemento a 1 del 3…
e così via. Questa caratteristica rende il codice “autocomplementante”.
ECCESSO 3
Il codice Eccesso 3 codifica le 10 cifre partendo dalla codifica binaria dei 10 nuemri da 0 a 9,
sommandogli però 3: lo 0 diventa così 0011 (0+3), l’1 diventa 0100 (1+3)…
Come si può osservare, anche questo codice è autocomplementante:
CODICE 2 su 5
Il codice “2 su 5” utilizza invece 5 bit: 2 sono sempre a 1, 3 sempre a 0. Il numero di possibili
permutazioni di 5 bit, di cui 2 di un tipo e 3 di un altro è proprio 10. Otteniamo così la seguente
codifica:
Teoria dell’informazione
Si può osservare che i pesi dei 5 bit sono 63210, tranne il numero zero.
Codice di Gray
Il codice di Gray non è un codice BCD, per cui possiamo rappresentare un insieme di numeri decimali
non necessariamente limotiati alle 10 cifre (da 0 a 9).
Ad esempio, il codice di Gray a 2 bit rappresenta le cifre da 0 a 3, quello a 4 bit da 0 a 8, quello a 4
bit, le cifre da 0 a 15. Non è un codice pesato, cioè i suoi bit non hanno un peso associato alla loro
posizione. La sua caratteristica principale è quella di avere ogni numero “distante” uno dal successivo
(e dal precedente). Con “distanza” si indica il numero di posizioni, in due sequenze di bit di uguale
lunghezza, nelle quali i simboli corrispondenti sono diversi. Ad esempio, la distanza tra 00100 e
10110 è 2 (in grassetto i bit diversi).
Nella figura, il codice di Gray a 4 bit:
La conversione da binario a Gray, si effettua nel seguente modo:
- Si ricopia il bit più significativo, quello di sinistra.
- Questo bit della nuova sequenza, viene sommato con il bit nella sequenza binaria successivo
(nella somma si ignorano i riporti).
- Il nuovo bit ottenuto, viene a sua volta sommato con il successivo nella sequenza binaria… e così
via fino alla fine
La conversione da Gray a binario, si effettua nel seguente modo:
- Si ricopia il bit più significativo, quello di sinistra.
- Si somma il bit più significato nella sequenza di Gray con il succesivo, per ottenere così la
seconda cifra binaria
- Si procede sommando a due a due i bit nella sequenza di Gray fino alla fine
Teoria dell’informazione
Approfondimento: si definisce n! - fattoriale di un numero interno n - il prodotto di tutti i numero da
1 a n; ad esempio, il fattoriale di 4 è 1*2*3*4=24, per cui 4!=24
Il fattoriale di 0 vale 1: 0!=1
Si definisce “coefficiente binomiale n su k”, con simbolo
il numero di sottoinsiemi di k
elementi estratti da un insieme di n. Nel nostro esempio (codice 2 su 5), il coefficiente binomiale
ci fornisce il numero di permutazioni di 5 oggetti, dei quali 2 di un tipo (e 3 di un altro tipo).
Il calcolo del coefficiente binomiale può essere effettuato con la seguente formula:
I codici correttori e rivelatori di errore
Una problematica che va affrontata quando si tratta di codificare informazione che deve essere
trasmessa a distanza in modo affidabile è la gestione degli errori. Per quanto la tecnologia usata sia
affidabile, può sempre succedere che per disturbi, interferenze elettromagnetiche o malfunzionamenti
di qualsiasi genere, l’informazione sia alterata. In altri termini qualcosa che è partito come 0 è arrivato
come 1 o viceversa. Esistono delle tecniche delle quali qui daremo un breve cenno che permettono
almeno di scoprire se ci sono stati errori ed in alcuni casi di correggerli. Piuttosto che addentrarci in
dettagli teorici andiamo subito al sodo con un esempio.
Si vuole trasmettere un messaggio numerico codificato con il codice BCD. Si parte dall’ipotesi che la
probabilità che avvenga un’errore sia sufficientemente bassa da ritenere che al massimo ce ne possa
essere uno ogni quattro bit. Supponiamo di trasmettere la cifra BCD 7 ed aggiungiamo un bit in coda
alla sua codifica secondo la seguente regola: facciamo in modo che il numero di 1 presenti tra i
cinque bit che trasmetto sia dispari. Cioè 7=0111 allora aggiungo uno 0 in modo che nella cinquina
01110 ho tre 1, cioè un numero dispari. In ricezione supponiamo sia giunto il messaggio 01010. E’
cambiato a causa di un disturbo sulla linea elettrica il valore di un bit. Chi riceve, tenete presente
l’ipotesi di un solo possibile errore nei cinque bit, si accorge dell’errore perché adesso il numero di 1
presenti nella cinquina non è più dispari. Riflettete sul fatto che con un errore o un 1 diventa zero o
uno zero diventa 1, in ogni caso il numero totale di 1 varia di un unità passando da pari a dispari e
quindi non torna più il conteggio. Il ricevente chiederà la ritrasmissione del dato errato. Questa tecnica
si chiama tecnica del bit di parità dispari. Se avessimo fatto in modo che il numero di 1 debba essere
pari avremmo parlato di parità pari. E’ indifferente che si scelga la parità pari piuttosto che quella
dispari, la scelta deve però essere fissata nel nostro sistema una volta per tutte ed ovviamente nota sia
al trasmettitore sia al ricevitore. Vediamo un esempio di parità pari. Trasmetto 3 in BCD a parità pari.
La codifica del 3 in quel codice è 0110 dunque anche in questo caso devo aggiungere uno 0 e
trasmettere 01100. I codici a parità pari o dispari si chiamano codici rivelatori di errore, in quanto
permettono solo di scoprire (rivelare) la presenza di un errore. La presenza di bit parità genera uno
spreco di memoria e di velocità di trasmissione, per cui può valere la pena cercare di capire ogni
quanti bit mi convenga inserirne uno di parità. Ad esempio se scopro che è bassissima la probabilità di
1 errore su 8 bit, invece di inserire un bit per ogni cifra del codice, ne inserisco 1 ogni coppia. Ciò non
potrà che essere frutto di un’analisi statistica delle caratteristiche del mezzo trasmissivo. Citiamo qui
in particolare le fibre ottiche che stanno avendo larghissima diffusione proprio in virtù di un’elevata
velocità di trasmissione e di un’altissima immunità ai disturbi.
Modificando la tecnica del bit di parità si possono costruire anche codici correttori d’errore cioè in
grado di scoprire se c’è un errore, ma anche di individuarne la posizione. In binario un errore è un 1
che diventa 0 o viceversa. A questo punto siamo a cavallo, basta cambiare il valore del bit che
Teoria dell’informazione
sappiamo essere errato. Vediamo un esempio di queste tecniche. Consideriamo il controllo di parità
longitudinale e trasversale. Partiamo dall’ipotesi che sia trascurabile la possibilità di più di un errore
su 16 bit. Aggiungeremo dei bit di parità ad un blocco di 16 bit, quindi nel caso di trasmissione in
codice numerico ogni quattro cifre. Facciamo l’ipotesi di trasmettere il numero 3682 in codice BCD.
Dispongo i bit da trasmettere secondo la seguente tabella:
3
6
8
2
0
0
1
0
0
0
1
0
0
0
1
1
0
1
0
1
0
0
0
0
1
1
0
0
Nelle caselle centrali ho inserito le codifiche normali secondo il BCD delle cifre da trasmettere, nelle
celle evidenziate ho invece inserito i bit di parità di tipo dispari. I bit di parità a destra sono calcolati
lungo le righe, quelli in basso lungo le colonne. Vediamo cosa succede in ricezione se si verifica un
errore. Supponiamo venga ricevuta la seguente sequenza di bit:
3
6
8
2
0
0
1
0
0
0
1
1
0
0
1
1
0
1
0
1
0
0
0
0
1
1
0
0
Si è incappati in un errore. Lo zero al centro è diventato 1 come evidenziato dalla sottolineatura. Se
però si fa in ricezione il controllo di parità si scoprirà che non quadrano i conti esattamente nella
seconda colonna e nella terza riga al cui incrocio si trova proprio il bit errato. A questo punto lo
possiamo correggere. Se solo una riga o una colonna presentano un valore di parità sballato non può
che essere il bit di parità ad essere errato. Se ci sono più errori non riusciamo correggerli ma
comunque ce ne accorgiamo.
?
6
?
2
0
0
1
0
0
1
1
1
0
1
1
1
1
1
0
1
0
1
0
1
1
1
0
0
Nel caso sopra abbiamo sicuramente due errori, attenzione che non possiamo correggerli, perché non
possiamo stabilire se i due bit sbagliati siano quelli in grassetto o quelli sottolineati.
La codifica del testo
Oltre che numeri i calcolatori elaborano testi. Vediamo come. Per la codifica dei testi ha uso molto
diffuso il cosiddetto codice ASCII. La sigla sta per American Standard Code for Information
Interchange. Esso è definito da uno standard internazionale noto come standard ISO 646. Ricordiamo
che l’ISO è l’International Standard Organization, un’ente internazionale preposto alla definizione di
regole omogenee in campo tecnico valide in tutto il mondo. Ecco la tabella ASCII in cui avete i
simboli rappresentati ed a fianco il valore decimale dei 7 bit corrispondenti
Tabella Ascii a 7 bit
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
0
1
2
3
4
5
6
7
8
9
NL
VT
NP
CR
SO
SI
DLE
DC1
DC2
DC3
10
11
12
13
14
15
16
17
18
19
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
20
21
22
23
24
25
26
27
28
29
RS
US
SP
!
“
#
$
%
&
‘
30
31
32
33
34
35
36
37
38
39
(
)
*
+
,
.
/
0
1
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
:
;
50
51
52
53
54
55
56
57
58
59
<
=
>
?
@
A
B
C
D
E
60
61
62
63
64
65
66
67
68
69
F
G
H
I
J
K
L
M
N
O
70
71
72
73
74
75
76
77
78
79
P
Q
R
S
T
U
V
W
X
Y
80
81
82
83
84
85
86
87
88
89
Z
[
\
]
^
_
`
a
b
c
90
91
92
93
94
95
96
97
98
99
d
e
f
g
h
i
j
k
l
m
100
101
102
103
104
105
106
107
108
109
n
o
p
q
r
s
t
u
v
w
110
x
111
y
112
z
113
{
114
|
115
}
116
~
117 DEL
118
119
120
121
122
123
124
125
126
127
Teoria dell’informazione
Figura 5
Una successiva standardizzazione ha definito versioni diverse per i cosiddetti codici ASCII estesi ad 8
bit (ISO 8859). In ognuno dei vari codici le prime 127 configurazioni coincidono con quelle del
codice a sette bit, mentre le restanti variano a seconda dei vari gruppi di alfabeti disponibili nel
mondo. Non tutte le lingue vi sono comprese, in particolare le lingue basate su ideogrammi ( cinese,
giapponese e coreano). Notiamo che i primi 32 caratteri ASCII non hanno corrispondente visuale a
schermo o in stampa ma sono caratteri di controllo usati per le telecomunicazioni o per rappresentare
alcuni particolari simboli. Ad esempio i caratteri di tabulazione (HT), l’invio (CR), il salto pagina
(NP), lo spazio bianco (SP). Nel 93 è stato definito un nuovo standard che promette di sostituire nel
tempo l’ASCII esteso. Si tratta dell’UNICODE. E’ una codifica a 16 bit, quindi con 216, cioè più di
64000 possibilità. Le prime 256 combinazioni corrispondono all’ASCII esteso dell’Europa
Occidentale e dell’America. Con il resto vengono codificati gli altri simboli necessari agli altri ASCII,
simboli matematici, più di ventimila ideogrammi ed altro ancora. Quando si parla di codifica dei
caratteri si potrebbe pensare in modo errato che i programmi che gestiscono il testo codifichino il loro
contenuto in puro ASCII. Per rendersi conto che non è così provate a creare un documento Word o un
documento di testo Star Office e salvarlo senza scriverci niente. Il risultato sulla mia macchina è stato
un documento di 19 kbyte!! Ciò significa che per poter gestire i testi con le sue regole interne Word
ha bisogno di un mucchio di informazione. Questa informazione è inoltre diversa da software a
software. Word non legge i file di Publisher ed i file PDF. Altra interessante esperienza è visualizzare
il codice interno delle pagine INTERNET sia in rete sia da voi prodotte con qualche editor per il Web,
se lo avete a disposizione. Da Explorer l’operazione è fattibile con Visualizza-HTML. Anche
scrivendo una sola riga vedrete parecchio codice aggiuntivo. Ma questo è un discorso su cui
ritorneremo. Sulla codifica e la rappresentazione del testo ci sarebbe ancora da dire parecchio.
Accenniamo brevemente ad alcune questioni. Primo se ci sono solo 256 codici come faccio ad avere
50 diverse forme tipografiche (Font) installate sulla mia macchina per ognuno di quei singoli codici?
In che cosa, al di là di un gusto estetico personale, si differenziano i vari font? Perché i font di caratteri
a disposizione negli editor Web o nei programmi di video scrittura soprattutto a grandi dimensioni
appaiono con lettere fortemente irregolari con una evidente seghettatura ai bordi? Perché poi stampati
assumono forma molto più regolare?
Sono problematiche relative alla rappresentazione del testo da un punto di vista tipografico. Possiamo
parlare comunque, almeno in senso lato, di codifica in quanto abbiamo a che fare con medesima
informazione veicolata in modi diversi a seconda delle diverse circostanze in cui deve essere
utilizzata. Si tratta dunque di diverse codifiche grafiche.
Cominciamo con il primo punto. Quando specifichiamo un font stabiliamo una corrispondenza tra ciò
che scriviamo ed il particolare contenuto di un file. Il codice per il carattere è sempre ASCII esteso,
ma prima della visualizzazione o della stampa si va a prendere la corrispondente rappresentazione
grafica nel file. I driver delle stampanti e dei monitor si occupano di fare ciò eseguendo gli ordini di
Word il quale da parte sua si ricorderà con suoi codici interni di reimpartire lo stesso ordine
ogniqualvolta si riaprirà quel documento. Per la seconda domanda introduciamo dei criteri di
classificazione per i vari tipi di font. Una prima distinzione si ha tra i caratteri con “grazie” o serif e
“senza grazie” o sans serif. Osservate la figura qui sotto: la prima T è un Arial 36,ed è un carattere
sans serif, cioè senza
Figura 6 - Caratteri serif e sans serif
decorazioni ai bordi delle lettere. Il secondo è un Times New Roman sempre 36 ed è un carattere serif.
Notate un’altra cosa. Le dimensioni geometriche a parità di punti dei due caratteri sono diverse.
Aspettatevi che scrivendo un documento e poi modificandone il font si possa scompaginare. Una
tabella che prima stava in una pagina magari adesso si divide su due. L’aspetto più bello dei caratteri
serif lo si nota solo alle grandi dimensioni, a piccole dimensioni, i caratteri sans serif sono più
leggibili almeno a video. L’altra distinzione che ci permette di classificare i font in due grandi
famiglie è tra caratteri a spaziatura fissa “monospaced” e variabile. In figura vediamo la stessa frase
in Courier 16 ed Arial 16. Il primo è un carattere monospaced, in cui ogni lettera occupa lo stesso
spazio e le lettere non si addossano, cosa che invece succede con l’Arial che riserva diverso spazio
Teoria dell’informazione
alle lettere. L’Arial alle dimensioni più grandi perde dei colpi. Notate di nuovo la differenza a parità di
punti delle dimensioni geometriche delle scritte.
Figura 7 - Due diversi font
Le altre due questioni riguardano il cosiddetto aliasing. Si tratta di quel particolare effetto per cui i
bordi dei caratteri appaiono seghettati soprattutto a grandi dimensioni. Visto che è possibile produrre
caratteri con il filtro anti alias, cioè in cui l’effetto viene compensato, vien da chiedersi come mai ci
siano font in cui ciò non è fatto. Di più se sotto Windows apriamo la cartella C:/Windows/Fonts,
possiamo facendo un doppio click su una qualsiasi icona dei file in essa contenuti visualizzare una
finestra di descrizione del font in cui leggiamo una serie di informazioni relative al copyrigth e delle
frasi visualizzate in quel font a diversi punti. Orbene vi sfido a trovare un font senza aliasing. Sembra
strano, ma la ragione è intuibile facendo l’esperimento di confrontare una scritta di grosse dimensioni
a video e la stessa scritta stampata anche con stampanti di qualità non eccelsa. La compensazione in
gran parte dell’effetto è fatta dalla stampante. Per quanto riguarda i caratteri di piccole dimensioni
l’antialias li rende sfocati, come potete verificare se lavorate in un programma di grafica.
Teoria dell’informazione