Capitolo 3 - MACCHINE E NUMERI

 

 

 

 

            3.1 - Le macchine per il calcolo.

 

                La prosecuzione dell'analisi delle strutture di macchina fin qui deli­neate in termini molto generali richiede ora l'approfondimento della natura dei dati, ossia del contenuto delle 'celle' o elementi di memoria o di disco. Esso è fondamentalmente numerico e la maggior parte delle operazioni sui dati è costituita da calcoli di qualche tipo; in effetti il calcolo è, o almeno era in origine, lo scopo principale.

 

                La costruzione di macchine per il calcolo ha sempre stimolato fantasia ed ingegno  con risultati spesso straordinari, ma sempre limitati dalla tecno­logia, che in passato era esclusivamente meccanica. Solo la comparsa di strumenti basati prima sulle proprietà elettromagne­tiche, poi sui semiconduttori ed attualmente utilizzando anche superconduttori ha permesso di realizzare un antico sogno, cioè macchine di grandi prestazioni a costi sufficientemente bassi, di accesso potenzialmente universale.

 

                L'evoluzione è stata estremamente rapida: i primi giganti a relais elettromeccanici e valvole termoioniche sono stati infatti costruiti poco più di quaranta anni fa, come strumenti di ricerca, estremamente costosi ed assai poco funzionali; giganti è un termine appropriato, perché tali macchine occupavano spazi enormi con consumi di energia altissimi e gravi  problemi (ad esempio il raffreddamento, ritornato con i superconduttori ); le prestazioni si misurava­no al massimo migliaia di operazioni al secondo, almeno negli intervalli tra un guasto e l'altro, frequentissimi per la natura dei componenti.

 

                Il passaggio di almeno due generazioni nelle tecniche di costruzione rende oggi disponibile una gamma di macchine  che va dalle calcolatrici tasca­bili incorporate in un orologio ai supercalcolatori; per i secondi l'unità di misura non è più il milione, ma il miliardo  di operazioni al secondo.

 

                Non basta, naturalmente, costruire macchine dotate di grandi capacità operative; è necessario definire di pari passo le regole necessarie per otte­nere dalle macchine stesse l'esecuzione di azioni finalizzate ad uno scopo specifico.

 

                Tale attività viene detta programmazione, intendendo per programma la sequenza di codici convenzionali, o istruzioni specifiche capaci di descrivere le azioni richieste.

 

                L'impiego dei linguaggi di programmazione per la soluzione di problemi di natura generale è strettamente connesso alla disponibilità delle macchine moderne, le cui prestazioni sempre più diversificate ed evolute hanno obbliga­to a codificare con pari efficienza le regole di comunicazione tra uomo e macchina, ad un livello tale da rendere giustificati termini come sintassi e quindi linguaggio.

 

                Per comprendere il senso dell'osservazione, si consideri che anche l'impiego di una macchina per il calcolo meccanico, come del resto la guida di un'automobile o l'uso delle posate, impone il ricorso ad un certo numero di regole: ne sono esempi: tirare una leva, premere un tasto, spostare un carrello, ruotare un indicatore , ecc., a rigore, anche in questo modo si definisce la sintassi di un linguaggio artificiale, anche se l'impiego di tale termine sembra eccessivo.

 

                La macchina da calcolo ci interessano le capacità operative ed il modo di utilizzarle; prendiamo spunto dal modello di  struttura delineata nel capitolo precedente, limitandoci alle sole opera­zioni della unità centrale, di cui considereremo la organizzazione logica,   senza supporre nulla sul piano tecnologico e costruttivo.

 


 

 

            3.2 - Modello di macchina per il calcolo.

 

                Iniziamo supponendo che la capacità minima sia quella di eseguire una somma conservandone termini e risultato, vale a dire quanto può essere espres­so nei termini algebrici :

 

  (3.2.1)                   A = B + C

 

ove i tre simboli, o variabili A, B, C  stanno a rappresentare numeri che possono anche coincidere in valore, ma sono distinti per il nome, il quale li rende riconoscibili ed utilizzabili nel contesto in cui sono definiti.

 

                Conviene in un primo tempo ipotizzare che i numeri siano interi, o più esattamente, appartenenti ad un sottoinsieme limitato di questi, ad esempio tra -32768 e +32767 che, come si vedrà, non sono affatto scelti a caso; ciò al fine della chiarezza nella definizione dei concetti, che verranno comunque estesi ad insiemi più generali.

 

                Una prima caratteristica del modello è quella di immagazzinare o  memo­rizzare entità simboliche (i valori numerici), vale a dire la presenza di un dispositivo fisico opportunamente detto  memoria, costruito in modo tale da osservare le regole formali delle  notazioni numeriche.

 

                La seconda caratteristica essenziale è la presenza di un dispositivo per la  elaborazione  di informazioni numeriche, che nel caso dell'esempio deve come minimo essere in grado di eseguire una ordinaria somma. Per un tale dispositivo sembra appropriato il nome di  addizionatore  e la sua natura deve essere dinamica, legata alle necessità di trasformazione dei dati, in contra­sto con quella statica della memoria, dedicata a conservarli.

 

                L'unità di elaborazione deve essere costruita in modo tale da osservare le regole delle operazioni aritmetiche; con termine tecnico, si dice che se ne implementano gli algoritmi, o schemi operativi; ciò si fa realizzando disposi­tivi fisici adeguati allo scopo: ad esempio circuiti elettrici.

 

                Presumibilmente, l'addizionatore implementerà (cioè realizzerà fisica­mente) l'algoritmo consueto, che consiste prima nell'incolonnare i due termi­ni,  poi nell'eseguire somme di una sola cifra per volta iniziando dall'ultima colonna e tenendo conto del possibile riporto.

 

                Le componenti dell'unità di elaborazione adatte a questi scopi vengono di norma chiamate  registri  e distinte per numero; si può ad esempio decidere di operare con due registri, il numero zero R0 per il primo addendo ed il numero uno R1 per il secondo. Il risultato viene in questo caso 'costruito' in R0, in modo da rendere più semplici eventuali catene di calcoli.

 

                Il modello semplificato di macchina da calcolo può essere rappresentato con lo schema:

 

(3.2.2)

                                 

 

                Sono evidenziate tre 'celle' con i loro nomi simbolici A, B, C ed i corrispondenti contenuti, o valori correnti, indicati con (A), (B), (C), notazione impiegata pure per i registri.. La separazione grafica dei due R0, R1 suggerisce che essi non debbono essere intesi come parte della memoria, ma della unità logico-aritmetica.

 

                A, B, C  rappresentano le posizioni della memoria su cui scrivere e da cui leggere un valore numerico; si intende, da parte della macchina  La se­quenza di passi necessari per ottenere quanto detto in (3.2.1) può essere descritta da:


 

  (3.2.3)                   (a) - COPIARE il contenuto di A in R0;

                                (b) - COPIARE il contenuto di B in R1;

                                (c) - SOMMARE R0 ed R1, con risultato in R0;

                                (d) - COPIARE il contenuto di R0 in C.

 

                La comprensione della necessità di tutti i dettagli della sequenza è estremamente importante per tutti gli sviluppi successivi. Vi compaiono infatti le funzioni essenziali delle macchine da calcolo, che si possono riassumere in  due tipi di operazioni:  trasferimenti e trasformazioni di dati.

 

                Una più attenta osservazione dello schema fornirà anche il punto di partenza per l'evoluzione dei linguaggi di programmazione.

 

 

 

 

 

            3.3 - Precisazione ulteriore del modello.

 

                Un'altra caratteristica importante, per quanto banale ciò possa sembrare (ma si impara in fretta che ben poche cose sono banali o scontate) è la capa­cità di rendere osservabile il risultato del calcolo, ossia di rappresentarlo in forma accettabile per un operatore umano.

 

                Si tratta della esistenza di canali di comunicazione tra utente e mac­china, del resto già necessari nel senso 'verso' di essa, affinché la richie­sta di esecuzione della somma possa essere formulata ed il valore dei suoi termini definito.

 

 

                Il precedente schema (3.2.2) si amplia quindi in:

 

  (3.3.1)

                    

 

 

                Anche la sequenza (3.2.3) può essere completata in:

 

  (3.3.2)                   (1) - TRASFERIRE dall'esterno il valore in A;

                                (2) - TRASFERIRE dall'esterno il valore in B;

                                (3) - COPIARE il contenuto di A in R0;

                                (4) - COPIARE il contenuto di B in R1;

                                (5) - SOMMARE R0 ed R1, con risultato in R1;

                                (6) - COPIARE il contenuto di R0 in C;

                                (7) - TRASFERIRE all'esterno il valore di C.

 

 

                Tale struttura può essere osservata in qualunque dispositivo adatto al calcolo: un semplice abaco, un essere umano, una macchina meccanica oppure una elettronica. Non ha in sé, quindi, nulla di specificatamente legato a que­st'ultima.


 

 

            3.4 - La rappresentazione dei dati.

 

                Per procedere nella definizione del modello ci poniamo il problema del come i dati  possano, o debbano essere  rappresentati in modo che siano ri­spettate le esigenze strutturali della macchina e  quelle del suo operatore umano  (ricordiamo che per ora ci limitiamo ai soli numeri interi).

 

                Con la tecnologia meccanica, quale ad esempio quella presente nei conta­chilometri non digitali tradizionali (attenzione, non nei tachimetri), la scelta più ovvia è quella dei ruotismi.

 

                E' infatti sufficiente dividere una ruota in dieci settori uguali tra loro, marcare ognuno di essi ordinatamente con le cifre da 0 a 9, inserir­ne un certo numero uno a fianco dell'altro e prevedere un dispositivo che al raggiungimento dell'ultimo settore di una ruota provochi lo scatto di un settore in quella adiacente a sinistra.

 

                In questo modo la struttura della macchina è ben definita, almeno ai fini della memorizzazione, ed il risultato è perfettamente soddisfacente in termini di comunicazione, poiché quella realizzata non è altro che la notazio­ne decimale posizionale dei numeri interi (quella 'naturale').

 

                Utilizzando ruotismi può essere un po’ più complesso il compito di co­struire un addizionatore, problema comunque brillantemente risolto in molti dispositivi meccanici, la cui difficoltà impone però severi limiti alla velo­cità di calcolo ed alle precisioni raggiungibili.

 

                La scelta della rappresentazione decimale è stata ovvia, poiché una ruota può essere suddivisa a piacere, in modo forse non assolutamente preciso, ma sufficiente allo scopo. E' quindi naturale il riferimento al contesto più familiare possibile.

 

                Le cose stanno diversamente se si opta per una tecnologia di tipo, ad esempio, elettrico oppure magnetico. Risulta stavolta piuttosto difficile la ricerca e l'impiego di dispositivi che rappresentino le cifre decimali in modo naturale.

 

                Si opera infatti in un contesto in cui in un filo passa corrente, oppure no, o un magnete risulta polarizzato in un verso oppure nell'altro; un esempio ancora più evidente è lo stato fisico di un interruttore che può solo essere aperto, oppure chiuso.

 

                In ogni caso, i dispositivi disponibili sono caratterizzati dall'equi­librio bistabile, ossia dalla capacità di trovarsi in ogni istante in modo stabile in uno di due stati fisici che si escludono a vicenda e tali che in un determinato istante uno dei due debba essere verificato. L'aggettivo 'stabile' indica in particolare la possibilità di prosecuzione indefinita nel tempo.

 

                Si potrebbe osservare che in quasi ogni dispositivo fisico operano inerzie e stati transitori per cui individuare l'istante esatto di un cambia­mento di stato può essere problematico, ma ciò interessa poco in questo conte­sto, che può ipotizzare una bistabilità ideale ed esaminarne le conseguenze dal solo punto di vista logico.

 

                Essa permette infatti di costruire una notazione numerica che non è quella decimale consueta, ma che risulterà altrettanto adatta alla costruzione di un sistema aritmetico completo, il cui vantaggio è quello di essere espres­so in termini perfettamente naturali per la macchina elettronica.

 

                Le scelta digitale binaria che faremo costituiscono una delle molte possibili soluzioni del problema, quella impostasi come la più economica ed efficiente; altre potrebbero essere una scelta analogica (variazioni continue), oppure una digitale decimale.

 


 

            3.5 - Esempi non decimali.

 

                L'idea che possano esistere alternative alla consueta notazione decimale dei numeri, ossia che numerazione ed aritmetica decimali non siano affatto 'leggi di natura' può sembrare sulle prime abbastanza strana.  Si potrebbe citare come esempio il sistema di numerazione romano, ma è ben noto che esso è poco efficiente, particolarmente per l'aspetto operativo.

 

                E' invece vero che nella pratica quotidiana tutti utilizzano senza particolari problemi almeno una alternativa al sistema decimale; riferendosi ad esempio alla misurazione del tempo, è normale dire che se si aggiunge un secondo ad altri 59 si ottengono non 60 secondi (che è comunque vero), ma un minuto, ossia:

 

  (3.5.1)                   59" + 1" = 1', 0"

 

                Vale a dire, la aggiunta di una unità in uno stato critico provoca l'az­zeramento e l'incremento di una unità al livello superiore, esattamente come accade di norma in:

 

  (3.5.2)                   99 + 1 = 100

 

                Si ha quindi un ciclo basato sul 60, come per le ore se ne ha uno basato sul 24. La misurazione degli angoli è un secondo esempio del tutto analogo, salvo che per la sostituzione di 360 a 24.

 

                Con gli angoli si rende ancora più evidente la natura non decimale delle operazioni aritmetiche: si pensi non tanto alla somma di due angoli, espressi in gradi, primi e secondi, quanto ad operazioni come moltiplicazione e divi­sione di angoli per fattori scalari frazionari; dato ad esempio l'angolo:

 

  (3.5.3)                   a = 18°, 26', 37"

 

si provi a determinarne i tre settimi. Al di là della difficoltà intrinseca delle operazioni, l'osservazione importante è quella sulla loro natura, che pure impiegando simboli decimali non è di tipo decimale.

 

                Dagli esempi citati (numeri romani, tempo ed angoli) si potrebbe dedurre che se pure esistono alternative al sistema decimale, queste sembrano essere poco convenienti, tanto che per gli angoli viene introdotta la misura alterna­tiva in radianti, che è un ordinario numero decimale. Proveremo invece che tali alternative esistono, né più né meno efficienti della scelta a cui siamo abituati.

 

 

 

 

 

            3.6 - La notazione decimale posizionale.

 

                Per giungere alle possibili alternative è necessario riesaminare e comprendere a fondo la ordinaria notazione dei numeri, il cui scopo è quello di fare corrispondere in modo il più possibile efficiente segni grafici di­stinti a quantità distinte.

                Si inizia creando una sequenza di simboli:

 

  (3.6.1)                   0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

 

ognuno dei quali associato alla operazione aggiungere una unità alla quantità precedente, salvo che per il primo, che identifica una quantità nulla.


 

                Ciò comporta, in particolare, un ordinamento naturale per i simboli della sequenza stessa.[1]

 

                Ma la operazione di base:  aggiunta di una unità = creazione di un simbolo  non può proseguire indefinitamente , poiché la moltiplicazione dei  simboli semplici o fondamentali, quali quelli della (3.6.1), comporterebbe problemi; come minimo quello del ricordarli.

 

                Si deve quindi porre un limite ai simboli dell'alfabeto numerico, che è appunto la sequenza data sopra: rifiutiamo cioè altri simboli fondamentali.

 

                Resta però la necessità di denotare in qualche modo la quantità ottenuta aggiungendo una unità a quella indicata con il simbolo 9. L'operazione è analoga alle precedenti, ma non abbiamo (non vogliamo avere) un ulteriore simbolo semplice.

 

                La soluzione, quasi obbligata, sta nell'utilizzare il limitato alfabeto (3.6.1) in combinazioni più complesse, cioè con la formazione di parole co­struite in modo ordinato,  di cui le prime sono le coppie.

 

                Si riutilizzano i simboli (3.6.1) nel loro ordine naturale, ma premet­tendo  un altro dei simboli stessi. La prima coppia possibile è quindi 10, poi 11, 12, ... fino ad 19, seguito da 20, 21, e così via. In particolare, 10 indica  la quantità successiva a quella associata a 9, definendo:

 

  (3.6.2)                   10 = 9 + 1.

 

                La sequenza (3.6.1) viene estesa ad una tabella, in cui gli elementi della prima riga sono stati rappresentati come coppie per preparare la genera­lizzazione successiva:

 

  (3.6.3)                   00 01 02 03 04 05 06 07 08 09

                                10 11 12 13 14 15 16 17 18 19

                                20 21 22 23 24 25 26 27 28 29

                                .............................

                                90 91 92 93 94 95 96 97 98 99

 

                E' evidente che il problema dell'esaurimento dei simboli si ripropone con 99, ma basta passare alla costruzione di terne ordinate, iniziando con il definire:

 

  (3.6.4)                   100 = 99 + 1

 

e poi 101, 102, ... fino a 999, a sua volta seguito da:

 

  (3.6.5)                   1000 = 999 + 1

 

e così via, in naturale modo combinatorio.

 

                La notazione numerica ottenuta si dice decimale perché basata sull'im­piego di dieci simboli e posizionale perché un medesimo simbolo fisico rappre­senta valori diversi a seconda della posizione occupata.

 

                La numerazione romana, invece, non è posizionale: si confrontino le scritture di:

 

  (3.6.6)                   22    (decimale posizionale)

 

  (3.6.7)                   XXII  (romano)

 

                Il simbolo  2  rappresenta nel primo caso  20 e 2 rispettivamente, cioè la (3.6.6) è una 'abbreviazione' di:

 

  (3.6.8)                   20 + 2,


 

mentre nel caso della (3.6.7) i simboli  X  ed  I , ognuno dei quali compare pure due volte, rappresentano sempre la medesima quantità, indipenden­temente dalla posizione occupata.

 

                La notazione romana è (molto) meno efficiente di quella posizionale da almeno due punti di vista: da un lato il numero di simboli da impiegare non è limitato a priori, rendendo necessarie continue aggiunte all'alfabeto numerico e dall'altro anche le più semplici operazioni aritmetiche risultano complesse oltre i limiti del ragionevole.[2]

 

                La notazione posizionale permette invece l'impiego di algoritmi aritme­tici, o schemi di operazioni, molto semplici; allo scopo, consideriamo ancora un esempio: il numero 2025, che è una abbreviazione di 2000 + 20 + 5, può essere scritto in modo più completo :

 

  (3.6.9)                   2 * 103 + 0 * 102 + 2 * 101 + 5 * 100

 

in cui il simbolo * indica la moltiplicazione, come è d'uso per i linguaggi di programmazione.

 

                Si tratta della consueta distinzione di unità, decine, centinaia, ecc., in cui l'impiego del simbolo '0' sta ad indicare che una potenza (nel nostro caso la seconda) non viene utilizzata.[3]

 

                Nella (3.6.11) si è impiegata nell'ultimo termine la nota proprietà aritmetica per cui l'elevazione alla potenza zero ha come valore l'unità, in modo da ottenere una completa omogeneità nella rappresentazione.[4]

 

                E' così evidente che il metodo combinatorio della espansione a sinistra che ha generato la notazione posizionale ha condotto a questo risultato:

 

  (3.6.10) Il numero  è  espresso  come  somma  delle potenze della base  (10), nella quale ogni

                                potenza è moltiplicata per un coefficiente che è uno dei simboli semplici della base.

 

                In linguaggio algebrico si dice che si è eseguita una combinazione lineare delle potenze della base, oppure la decomposizione in tali potenze.

 

                Ogni numero intero positivo può essere rappresentato in questa forma: se  N  è il numero e  k  è la massima potenza del 10 presente nella decomposizione la rappresentazione è:

 

  (3.6.11) N = ak* 10k + ... + a1* 101 + a0* 100

 

in cui i coefficienti sono scelti tra i simboli semplici della base, ossia:

 

  (3.6.12) 0 <= ak < 10  , per ogni k

 

(si legga 'minore o uguale' il simbolo composto  <= ;  anche questa è una convenzione comune nei linguaggi di programmazione, dovuta alla limitata presenza di simboli sulla tastiera).

 

  E' facile provare che:[5]

 

  (3.6.13) la decomposizione di un  intero  positivo  nella somma di potenze della base, ognuna moltiplicata

                                per un coefficiente opportuno, è  unica, ossia è unica la determinazione dei coefficienti.


                Dall'espressione (3.6.11) deriva, ad esempio,  la semplicità dell'algo­ritmo della somma di due interi scritti in notazione posizionale: il consueto incolonnare e sommare dal fondo una cifra per volta (con i riporti) è esso pure una 'abbreviazione' del più completo procedimento di somma sulle potenze, con raccoglimento a fattor comune e riduzione. La sottrazione è  altrettanto semplice, mentre prodotto e divisione richiederebbero qualche considerazione addizionale, che non interessa in questo contesto.

 

 

 

            3.7 - Una alternativa: i numeri ottali.

 

                Abbiamo ormai posto le basi per rispondere alla domanda fondamentale sull'esistenza di alternative efficienti alla numerazione decimale.

 

                Sovente una domanda ha in sé buona parte della risposta, almeno quando la domanda è 'quella giusta'. Nel caso attuale la questione andrebbe forse rovesciata, chiedendosi piuttosto perché è stata scelta la base  dieci, ossia perché i simboli fondamentali dell'alfabeto dei numeri sono quelli in (3.6.1), né uno di più, né uno di meno.

 

                Questa è una argomentazione legittima, perché è evidente la natura arbitraria della decisione. E' molto probabile che la ragione stia nel posse­dere dieci dita, ed altrettanto probabile che, se la natura ce ne avesse date solo otto, al posto della sequenza (3.6.1) vi sarebbe stata :

 

  (3.7.1)                   0 , 1 , 2 , 3 , 4 , 5 , 6 , 7

 

ed ogni ulteriore estensione sarebbe sembrata 'innaturale'. Diciamo ottale una simile scelta.

 

                A rigore sarebbe stato opportuno inventare nuovi simboli, ma poiché quelli della (3.7.1) stanno ad indicare le medesime quantità che già rappre­sentano nella notazione decimale con il medesimo ordinamento, un cambiamento di simboli sarebbe stato una inutile fonte di difficoltà.

 

                E' evidente che con 7 si pone il problema incontrato in precedenza con  9; se si vuole proseguire si porrà, in modo analogo:

 

  (3.7.2)                   10 = 7 + 1   (notazione ottale)

 

e l'unica barriera psicologica che può impedirne la comprensione della logica è proprio la 'assuefazione alla decimalità'.

 

                Poiché per semplicità non abbiamo coniato nuovi simboli, si ha ora possibilità di confusione per la sequenza '10', che ha due possibili signifi­cati distinti: dieci se 'parliamo' decimale ed otto se invece ci esprimiamo in ottale.

 

                Vale a dire, si dovrebbe scrivere più esattamente:

 

  (3.7.3)                   10 (ottale) = 7 (ottale) + 1 (ottale)  .

 

                Ove necessario, evidenzieremo nel seguito la base di numerazione in modo esplicito, ma in genere la precisazione non sarà necessaria. In particolare per quel che segue daremo per scontato l'impiego dei simboli nel senso ottale.

                La prosecuzione naturale delle coppie ordinate conduce a:

 

  (3.7.4)                   00  01  02  03  04  05  06  07

                                10  11  12  13  14  15  16  17

                                20  21  22  23  24  25  26  27

                                ..............................

                                70  71  72  73  74  75  76  77  ,

 

in cui, come si verifica contando,  11 sta per il solito nove, 20 per sedici, e 77 per sessantatré, con la conseguenza che per il successivo (sessantaquat­tro) si ha:


 

  (3.7.5)                   100 = 77 + 1

 

e mentre il simbolo corrispondente alla base si scrive ancora 10, la sua seconda potenza si scrive 100, mentre la terza è:

 

  (3.7.6)                   1000 = 777 + 1   (in decimale 512 = 511 +1)

 

rendendo evidente che la regola combinatoria richiede una posizione addiziona­le a sinistra in corrispondenza al salto di una potenza della base.

 

                Salvo il diverso numero di elementi, le regole formali delle combinazio­ni sono esattamente le stesse del caso decimale, come le stesse sono pure le conseguenze, in particolare la capacità di denotare ogni numero intero facendo ricorso ad un insieme limitato di simboli fondamentali.

 

                Ad esempio, il numero ottale  326 verrà letto come somma di 6 unità, 2 'ottine' e 3 'ottine al quadrato', ossia:

 

  (3.7.7)                   3 * 102 + 2 * 101 + 6 * 100  .

 

  Tornando temporaneamente alla notazione decimale, la quantità che esso rappresenta è quindi  3 * 64 + 2 * 8 + 6, ossia 214 decimale.

 

                La considerazione più importante è la seguente:

 

  (3.7.8)                   nella base otto (scritto 10) vale la espressione di decomposizione (3.6.11) senza neppure

                                bisogno di cambiamento di notazione.

 

                Valgono quindi anche le sue conseguenze; in particolare la somma di numeri ottali si esegue esattamente come quella decimale. E' ovviamente neces­sario tenere conto che, ad esempio, 6 + 4 ha come risultato 2 con riporto di 1, e così via.

 

                Verifichiamo con un esempio. Già sappiamo che:

 

  (3.7.9)                   326 (ottale) = 214 (decimale)

 

e poiché:

 

  (3.7.10) 202 (ottale) = 130 (decimale)

 

ci attendiamo che la somma coincida con 344 (decimale).

 

  (3.7.11) 3  2  6  +

                                2  0  2  =

                                -------

                                5  3  0

 

che in decimale è appunto 5 * 64 + 3 * 8 = 320 + 24 .

 

                Oltre alla notazione alternativa per i numeri si ha anche una aritmetica alternativa, tanto completa ed efficiente quanto quella decimale; la sola differenza di qualche peso sembra essere il fatto che la scrittura di un numero risulta generalmente più lunga: ad esempio 512(decimale), che richiede tre cifre, diviene 1000(ottale) e ne richiede quattro. Ciò è ovvia conseguenza della riduzione nel numero di simboli fondamentali.

 


            3.8 - La numerazione esadecimale.

 

                Salvo forse per il primo impatto, la numerazione ottale può essere accettata come 'naturale', ossia come sostituto a quella decimale, costituen­done in un certo senso una immagine ridotta, poiché tutti i simboli di parten­za mantengono il loro significato, diminuendo solo in numero.

 

                E' evidente che lo schema combinatorio avrebbe funzionato altrettanto bene se la scelta fosse stata, ad esempio, di cinque o sette numeri di parten­za. Ciò si può verificare riproducendo quanto visto in precedenza per la base otto; in particolare si osservi l'alternanza dei pari e dispari.

 

                E' un Po più complesso verificare che possono essere altrettanto valide le scelte di basi superiori a dieci, composte cioè di un numero di simboli semplici maggiore del consueto.

 

                Con la stessa ipotesi già fatta in precedenza, ci si immagini dotati, ad esempio, di sedici dita: per costruire la numerazione posizionale si dovrebbe quindi partire da una sequenza di altrettanti simboli elementari.

 

                Per semplicità supponiamo che quelli iniziali siano gli stessi del caso decimale, ossia impieghiamo ancora la (3.6.1), che però ora decidiamo di proseguire per altri sei posti. Si potrebbero inventare simboli grafici nuovi, ma per rendere evidente l'ordinamento conviene ricorrere alle prime lettere dell'alfabeto, la cui sequenza è familiare.

 

                Si inizia allora con:

 

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

 

ossia impieghiamo 'A' per la quantità 'dieci', 'B' per 'undici' ...  'F' per 'quindici'. E' solo una convenzione, dichiaratamente del tutto arbitraria, ma naturale ed efficiente.          Diremo  esadecimale  questa notazione;   salvo  una possibile resistenza iniziale al leggere alcune lettere come cifre numeriche, non vi è nulla di so­stanzialmente diverso dai casi decimale ed ottale.

 

                Procedendo, si ha:

 

  (3.8.2)                   10 = F + 1    (notazione esadecimale)

  (3.8.3)

 00

01

02

03

04

05

06

07

08

09

0A

0B

0C

0D

0E

0F

10

11

12

13

....

....

 

 

 

 

 

 

 

 

1E

1F

....

....

....

....

....

....

 

 

 

 

 

 

 

 

 

 

E0

E1

E2

E3

....

....

 

 

 

 

 

 

 

 

EE

EF

F0

F1

F2

F3

F4

F5

F6

F7

F8

F9

FA

FB

FC

FD

FE

FF

 

(3.8.4)                     100 = FF + 1

 

e così via, ancora con i simboli  10, 100, 1000, ... che stanno ad indicare le successive potenze della base (in decimale, 16, 256, 4096, ...).

 

                Poiché le regole combinatorie sono sempre le stesse, la loro applicazio­ne conduce a medesimi risultati anche in presenza di un maggior numero di simboli semplici. In particolare, rimane invariata la espressione (3.6.11) e continuano a valere le solite regole per le operazioni aritmetiche.

 

                Come il passaggio dalla base dieci alla otto allunga in genere la scrit­tura dei numeri, il passaggio alla base sedici la accorcia: ad esempio il simbolo  'FF'  equivale al decimale 255.

 

                Le due notazioni alternative, ottale ed esadecimale, non sono state scelte casualmente, così come non è casuale il fatto che entrambi i valori (8 e 16) siano potenze del due. Per l'importanza che esse  hanno nelle applicazioni ai calcolatori è opportuno provare, per esercizio, ad eseguire un certo numero di operazioni nelle due basi, come pure alcune conversioni di numeri. La conversione di numeri da una base all'altra è, in effetti, un ottimo tema per esercizi di programmazione in ogni linguaggio.


 

            3.9 - Altre basi possibili

 

                Si è così visto che esistono alternative funzionalmente equivalenti alla notazione decimale, sia impiegando un minor numero di simboli, sia uno maggio­re; è lecito chiedersi se esistano limiti alle alternative, ossia se esistano un valore massimo ed uno minimo per le basi possibili.

 

                Mentre è evidente che non esiste un massimo, nel senso che qualunque insieme di simboli semplici distinti, per quanto grande, potrebbe costituire una base di numerazione (con il solo ostacolo del ricordarli), è meno ovvio il caso del minimo.

 

                Poiché deve esistere almeno un simbolo di base, si potrebbe ipotizzare in uno il valore minimo. Per valutare le conseguenze di una tale scelta, utilizziamo un segno grafico qualunque per tale unico simbolo, ad esempio:

 

  (3.9.1)                   &   (unico simbolo 'unario')

 

                Per iniziare, potremmo avere qualche difficoltà nello stabilire se il simbolo scelto deve rappresentare la quantità nulla o quella unitaria, ma poiché con esso i simboli semplici sono esauriti, la quantità successiva non può che essere rappresentata dalla coppia:

 

  (3.9.2)                   &&   (seconda combinazione unaria)

 

prima coppia ed anche ultima; segue quindi:

 

  (3.9.3)                   &&&  (terza combinazione unaria)

 

ed è subito evidente che in questo modo non si ottiene altro che il più primi­tivo sistema di conteggio, che impiega tanti segni grafici quante sono le unità da rappresentare, con una corrispondenza biunivoca tra elementi costi­tuenti il simbolo grafico ed elementi dell'insieme da rappresentare.

 

                Si sono cioè perdute le proprietà essenziali della notazione posiziona­le, tanto che non ha nemmeno più interesse la rappresentazione dello zero.

 

                Il massimo sviluppo di una notazione unaria può essere un sistema di numerazione del tipo di quello romano, ma è certamente molto difficile basare su essa una aritmetica efficiente.[6]

 

                La risposta al problema del minimo è quindi trovata: la base di numera­zione deve impiegare almeno due simboli, uno per lo zero e l'altro per l'uni­tà. Senza di essi si perderebbero infatti i vantaggi che derivano dalla espressione (3.6.11).

 



[1]Per  un approfondimento ci si riferisca alla definizione dei numeri cardinali nella Teoria degli Insiemi ed agli assiomi di Peano nella Teoria dei Numeri.

 

[2]Può infine esservi una relazione abbastanza stretta tra tale cambiamento e la 'esplosione' delle scoperte algebriche.

 

[3]Sono note le diatribe storiche sulla natura filosofica dello "zero come numero". Si osservi che con la notazione posizionale il problema non si può porre, poiché non si tratta di una scelta, ma di una necessità operativa.

 

[4]E' ben vero che questo sposta soltanto il problema, ma ne potrebbe derivare una visione della matematica meno 'vessatoria' e più legata alla coerenza logica.

 

[5]Basta infatti supporre che esistano due simili sequenze che rappresentano il medesimo intero N. Eseguendone la differenza, si ottiene una sequenza che deve essere identicamente nulla. Per maggiori                 detta­gli ci si riferisca ad un testo di Algebra (anelli a fattorizzazione unica).

 

[6]  In riferimento alla precedente nota sullo zero come numero si può ora osservare che, mentre nella notazione posizionale lo zero è una necessità, in quella non posizionale che deriva dal semplice conteggio, esso è addirittura un 'fastidio', perché l'unico simbolo presente è il rappresentante naturale dell'unità e non esiste quindi una notazione accettabile per lo zero.   Allo  stesso modo, ed altrettanto non casualmente, lo sviluppo di un notazione operativamente accettabile per i numeri negativi è perlomeno un problema consistente.