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