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