Conversioni numeriche: un approccio didattico diverso

Metodo di Horner

Conversione Binario ↔ Decimale

Hands on Stem — Prof. Davide Bertolino

1. Introduzione

Esistono diversi metodi per convertire un numero dalla rappresentazione binaria a quella decimale e viceversa: la notazione posizionale (somma dei pesi), la tabella delle potenze di 2, il double dabble (usato nei circuiti digitali) e il metodo di Horner. Ognuno ha i propri vantaggi e contesti di applicazione.

Perché proprio Horner? In questo articolo scegliamo di approfondire il metodo di Horner perché si riduce a un algoritmo semplice e ripetitivo: le uniche operazioni richieste sono moltiplicare per due e sommare uno (o il valore del bit corrente). Questo lo rende particolarmente adatto a un approccio didattico: è facile da ricordare, facile da eseguire a mano e facile da implementare in un programma. È un approccio forse meno rigoroso dal punto di vista formale rispetto alla notazione posizionale classica, ma decisamente più pratico e immediato per chi si avvicina per la prima volta alle conversioni di base.

Il metodo prende il nome dal matematico britannico William George Horner (1786-1837), sebbene fosse già noto a matematici cinesi e persiani molti secoli prima. Permette di convertire un numero da una base qualsiasi alla base 10 (metodo diretto) e dalla base 10 a una base qualsiasi (metodo inverso). I due procedimenti sono algebricamente simmetrici: uno compone il polinomio posizionale, l’altro lo scompone.


2. Dalla forma classica a Horner

La rappresentazione posizionale di un numero binario a n cifre è:

N = bₙ₋₁·2ⁿ⁻¹ + bₙ₋₂·2ⁿ⁻² + … + b₁·2¹ + b₀·2⁰

Questa espressione richiede il calcolo di tutte le potenze di 2. Il metodo di Horner riscrive lo stesso polinomio in forma annidata (nested form):

N = ((…((bₙ₋₁·2 + bₙ₋₂)·2 + bₙ₋₃)·2 + …)·2 + b₁)·2 + b₀

Esempio concreto

Convertiamo 110101₂ in decimale:

Classica: 1·2⁵ + 1·2⁴ + 0·2³ + 1·2² + 0·2¹ + 1·2⁰

Horner: ((((1·2 + 1)·2 + 0)·2 + 1)·2 + 0)·2 + 1

La forma di Horner elimina la necessità di calcolare le potenze: serve solo moltiplicare per 2 e sommare, operazione dopo operazione.


3. Horner Diretto: Binario → Decimale

Algoritmo

  1. Inizializza l’accumulatore ACC con il valore del primo bit (MSB, il più a sinistra).
  2. Per ogni bit successivo, da sinistra a destra: ACC = ACC × 2 + bit
  3. Quando tutti i bit sono stati elaborati, ACC contiene il valore decimale.

Esempio passo per passo

Convertire 110101₂:

PassoOperazioneACC
Startprendi 1 (MSB)1
11 × 2 + 13
23 × 2 + 06
36 × 2 + 113
413 × 2 + 026
526 × 2 + 153

Risultato: 110101₂ = 53₁₀


4. Horner Inverso: Decimale → Binario

Algoritmo

  1. Dividi il numero per 2 e annota il resto.
  2. Ripeti la divisione con il quoziente ottenuto, fino a raggiungere quoziente 0.
  3. Leggi i resti dal basso verso l’alto: il primo resto è il LSB, l’ultimo è il MSB.

Esempio passo per passo

Convertire 53₁₀ in binario:

PassoDivisioneQuozienteResto
153 ÷ 2261 (LSB)
226 ÷ 2130
313 ÷ 261
46 ÷ 230
53 ÷ 211
61 ÷ 201 (MSB)

Risultato: 53₁₀ = 110101₂ (resti letti dal basso verso l’alto ↑)


5. La simmetria dei due metodi

Il metodo diretto e quello inverso sono operazioni algebricamente simmetriche, come encoding e decoding dello stesso schema polinomiale:

Diretto (Encoding)

  • Legge bit da sinistra a destra
  • Operazione: ACC × 2 + bit
  • Compone il polinomio
  • Input: cifre binarie → Output: valore decimale

Inverso (Decoding)

  • Produce bit da destra a sinistra
  • Operazione: N ÷ 2, resto = bit
  • Scompone il polinomio
  • Input: valore decimale → Output: cifre binarie

6. Generalizzazione a qualsiasi base

Il metodo di Horner non è limitato alla base 2. Le formule generali sono:

Diretto (base B → decimale): ACC = ACC × B + cifra

Inverso (decimale → base B): N ÷ B → quoziente + resto

Esempi

  • Base 8 (Ottale): 357₈ → ((3×8+5)×8+7) = 239₁₀
  • Base 16 (Esadecimale): 2A₁₆ → (2×16+10) = 42₁₀
  • Base 10 (verifica): 435₁₀ → ((4×10+3)×10+5) = 435₁₀

7. Riepilogo

  • ✓ Il metodo di Horner riduce la valutazione di un polinomio a operazioni sequenziali semplici.
  • ✓ Diretto: moltiplica l’accumulatore per la base e somma la cifra (da MSB a LSB).
  • ✓ Inverso: dividi per la base e raccogli i resti (si leggono in ordine inverso, da LSB a MSB).
  • ✓ Funziona con qualsiasi base: binario, ottale, esadecimale, decimale…
  • ✓ Diretto e inverso sono algebricamente simmetrici: encoding ↔ decoding.