Numeri duodecimali

Numeri duodecimali

Vai a

Copertina

Pagine italiane

Percorso completo

Indietro

Inglese


Introduzione
Introduzione
Addizione
Addizione
Moltiplicazione
Moltiplicazione

Introduzione

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.

Scarica la macro

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 ;

Dario de Judicibus © 1997-2009