Numeri duodecimali |
|
Introduzione |
Addizione |
Moltiplicazione |
Chiunque conosca un po' di programmazione non avrà problemi a lavorare con sistemi numerici a base differente da 10. In informatica si usano ad esempio ben tre diversi sistemi numerici: quello a base 2, o binario, quando si lavora ai livelli più bassi, come ad esempio si disegnano i circùiti logici o si definiscono nuovi protocolli fisici di comunicazione; quello a base 8, che permette di operare più velocemente sui numeri binari e che è molto utile con i protocolli di livello più elevato come quelli di trasporto, i quali utilizzano fondamentalmente gli ottetti; e quello a base 16 che viene usato nelle rappresentazioni ad alto livello dei flussi di dati, degli indirizzi di memoria, delle mappe di caratteri ed altro ancora.
Nella vita di tutti i giorni usiamo invece il sistema decimale, anche se in alcuni paesi, come ad esempio gli Stati Uniti d'America, si utilizzano ancora vecchi sistemi di misura che affondano le loro origini nel medioevo ed oltre, come miglia, piedi, once, libbre e via dicendo. In Inghilterra, fino a qualche tempo fa, si usava per le monete un sistema a base 12. A dozzine vengono ancor oggi vendute le uova e 12 sono le ore del giorno, anche se poi il sistema di misura del tempo opera con i sessagesimi (60).
In realtà l'unico valido motivo per utilizzare un sistema decimale è quello che abbiamo dieci dita, se ci limitiamo alle mani, per cui venne spontaneo usare un tale sistema anche se, come vedremo, non è certo fra i migliori.
Il numero 10 si può dividere solo per 2 e per 5, infatti, e questo limita la possibilità di frazionare un numero come più conviene. Il 12 invece si può dividere per 2, 3, 4, e 6, ed un sistema basato su tale basa risulta inoltre più comodo quando si vogliono esprimere numeri grandi, grazie alle due ulteriori cifre. Ovviamente è necessario imparare da zero una nuova tabellina delle addizioni e delle moltiplicazioni, ma come si può vedere nelle due sezioni apposite, queste tabelline risultano più semplici di quelle a base 10. In particolare, le colonne del 2, del 3, del 4, del 6, dell'8 e del 10 sono molto semplici da imparare in un sistema a base 12. Solo quella del 5, del 7 e del 9 sono un po' più complesse da ricordare. Viceversa nel sistema decimale le colonne semplici sono quella del 2 e del 5. Le altre vanno imparate bene a memoria.
Per la cifra corrispondente al 10 ho scelto la lettera X, dato che in numeri romani 10 si scrive X e la sua forma differisce sufficientemente da quella delle 9 cifre del sistema decimale. Analogamente per l'11 ho scelto l'H, sempre perchè ha una forma sufficientemente distinguibile da quella degli altri simboli e poi perchè ricorda due uno affiancati ed uniti da un trattino orizzontale. Le dodici cifre risultanti, zero compreso, sono quindi:
0 1 2 3 4 5 6 7 8 9 X H
Ho sviluppato una semplice macro in REXX che produce le tabelle per l'addizione e la moltiplicazione in base 12. Per eseguirla è necessario installare un interprete REXX. La macro può essere eseguita su qualunque sistema operativo dove un tale interprete sia disponibile.
Per comodità riporto qui il listato:
/* REXX */ /* Author: Dario de Judicibus */ /* Address: dario@dejudicibus.it */ /* Created: 13 May 2003 */ /* Version: 1.0.0 */ parse arg op if op = '' | op = '?' | op = '/?' | op = '-?' | op = '/h' | op = '-h' then do say "SYNTAX" say " base12 [?|operation]" say " operation = [+|*]" say "" say "PURPOSE" say " Display the addition or multiplication table" say " for base 12 numbers" exit end if op = '+' then do call sayhead op call sayadd end else if op = '*' then do call sayhead op call saymult end else say "Unknow operation" op exit sayadd: procedure do i = 1 to 12 s = right(10to12(i),3) || '|' do j = 1 to 12 k = i + j s = s || '|' || right(10to12(k),3) end say s end return saymult: procedure do i = 1 to 12 s = right(10to12(i),3) || '|' do j = 1 to 12 k = i * j s = s || '|' || right(10to12(k),3) end say s end return sayhead: procedure parse arg ochar . s = right(ochar,3) || '|' do j = 1 to 12 s = s || '|' || right(10to12(j),3) end say s say left('',length(s),'-') return 10to12: procedure arg n10 . n12 = '' i10 = n10 ; f10 = n10 ; do while i10 <> 0 f10 = i10 // 12 ; i10 = i10 % 12 ; if f10 < 10 then d12 = f10 else if f10 = 10 then d12 = 'X' else if f10 = 11 then d12 = 'H' else d12 = '?' n12 = d12 || n12 ; end return n12 ;