Esprimere un numero in basi diverse (due dubbi)

Vegetabbo
Ho un numero, ad esempio espresso in base 10, e voglio convertirlo in base 2.
Il metodo che conosco io è il seguente:
si continua a dividere il numero per 2 finché non risulta impossibile dividerlo ulteriormente. A quel punto si scrivono i resti delle varie divisioni in ordine top-down (da destra verso sinistra) e il gioco è fatto.
10 : 2 = 5 (resto 0)
5 : 2 = 2 (resto 1)
2 : 2 = 1 (resto 0)
1 : 2 = 0 (resto 1)

risultato: 1010 è il numero 10 espresso in base 2.

La prima domanda è: tale metodo funziona anche con basi diverse da 2? Io credo di sì...

La seconda domanda è: come faccio invece a passare da un numero espresso in base 10 allo stesso numero espresso in una base maggiore? (es. in base 12)

Risposte
apatriarca
Puoi usare lo stesso identico metodo.. Se le cifre per la base \(12\) sono \(0,1,2,3,4,5,6,7,8,9,A,B\) il numero \(154\) diventa:
\(154 / 12 = 12 \, (\mbox{resto } 10)\)
\(12 / 12 = 1 \, (\mbox{resto } 0)\)
\(1 / 12 = 0 \, (\mbox{resto } 1)\)
da cui si ottiene che \( 154_{10} = 10A_{12} = 1 \times 12^2 + 10 \times 12^0 \). Alternativamente la cifra \(i\)-esima di un numero \(N\) positivo in base \(b\) si ottiene con la formula: \( \lfloor N / b^i \rfloor - b \lfloor N / b^{i+1} \rfloor \). Nel caso di \(154\) si otterrebbe:
Cifra \(0\)-esima: \( 154 - 12 \times 12 = 10 \)
Cifra \(1\)-esima: \( 12 - 12 \times 1 = 0 \)
Cifra \(2\)-esima: \( 1 - 12 \times 0 = 1 \).
L'algoritmo descritto qui sopra è abbastanza comodo nel caso in cui non si voglia fare uso del modulo (che è un'operazione molto costosa in termini di performance su alcuni sistemi in cui non è disponibile direttamente*).

* Se infatti il processore non dispone di tale operazione è necessario fare ricorso alla formula: \(N \mod b = N - b \times \lfloor N / b \rfloor \). Questa è in effetti la formula usata nell'algoritmo alternativo che ti ho mostrato, ma implementandola direttamente in tali sistemi è possibile riutilizzare i valori precedentemente calcolati e ottenere potenzialmente performance maggiori.

Vegetabbo
Mi torna, ma coi numeri grandi come si fa?

Il mio esercizio chiede di trasformare il numero 43.000.000.000 in base 12.
O non so usare la calcolatrice (possibile) oppure qualcosa non va coi numeri grandi...

apatriarca
Funziona perfettamente anche con i grandi numeri, ma se stai usando un computer potresti non essere in grado di rappresentare correttamente i numeri dei quale vuoi calcolare la rappresentazione a base \(12\). Per rappresentare il tuo numero sono necessari \(64\) bit (in realtà ne basterebbero \(36\) ma non ci sono normalmente tipi intermedi tra gli interi a \(32\) bit e quelli a \(64\)).

Vegetabbo
Boh, sto usando la calcolatrice scientifica.

Ok, ammesso che sia riuscito ad arrivare alla conclusione (che per inciso è 8.400.743.314) ora mi viene un dubbio ulteriore:

Se il problema fosse "esprimere il numero 8.400.743.314(12) in base 10" cosa dovrei fare? a parte il semplice 8*12^9 + ecc ecc.. che mi da precisamente 43.000.000.000 non dovrei arrivare alla stessa conclusione col metodo delle divisioni che ho illustrato all'inizio per passare da 10 in base 10 a 10 in base 2 ???

Perché proprio non ci riesco...

apatriarca
Il problema del passaggio da base 12 a base 10 usando il tuo metodo è che fare le divisioni e i moduli in questa base non è per noi immediato (e il computer o la calcolatrice scientifica non lavorano direttamente in questa base). Ma il metodo è valido in ogni base.

La calcolatrice usa forse un metodo differente rispetto al PC* per memorizzare i numeri, ma è anch'essa limitata nella dimensione massima dei numeri rappresentabili. Il problema potrebbe essere quindi legato a questo.

* Credo che faccia uso di un formato decimale.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.