Numeri periodici e frazione generatrice
Un numero con un numero finito di cifre dopo la virgola in base 10 può diventare periodico in un'altra base (ad esempio 0,210 = 0,00112). Questa pagina riepiloga le regole per prevederlo; gli esempi di conversione svolti si trovano in Numeri reali.
Classificazione dei numeri decimali
- LIMITATO
- ILLIMITATO
- NON PERIODICO (irrazionali)
- PERIODICO
- SEMPLICE (se dopo la virgola c'è subito il periodo)
- MISTO (se dopo la virgola c'è l'antiperiodo seguito dal periodo)
Da numero decimale a frazione generatrice
- La frazione generatrice di un numero decimale limitato è una frazione avente:
- a numeratore il numero senza virgola;
- a denominatore un 1 seguito da tanti zeri quante sono le cifre decimali.
Esempi:
- 1,01 = 101/100 = \( \frac{101}{100} \)
- 0,11 = 11/100 = \( \frac{11}{100} \)
- 32,1 = 321/10 = \( \frac{321}{10} \)
- La frazione generatrice di un numero decimale periodico semplice è una frazione avente:
- al numeratore la differenza tra l'intero numero scritto senza la virgola e la parte intera;
- al denominatore tanti nove quante sono le cifre che compongono il periodo.
Esempi:
- 22,3 = (223-22)/9 = 201/9 = \( \frac{201}{9} \)
- 0,29 = (29-0)/99 = 29/99 = \( \frac{29}{99} \)
- 1,213 = (1213-1)/999 = 1212/999 = \( \frac{1212}{999} \) = 404/333 = \( \frac{404}{333} \)
- La frazione generatrice di un numero decimale periodico misto è una frazione con:
- a numeratore la differenza tra l'intero numero senza virgola e tutto ciò che non fa parte del periodo;
- a denominatore tanti nove quante sono le cifre che compongono il periodo, seguiti da tanti zeri quanti sono le cifre dell'antiperiodo.
Esempi:
- 2,23 = (223-22)/90 = 201/90 = \( \frac{201}{90} \) = 67/30 = \( \frac{67}{30} \)
- 0,23 = (23-2)/90 = 21/90 = \( \frac{21}{90} \) = 7/30 = \( \frac{7}{30} \)
- 1,213 = (1213-121)/900 = 1092/900 = \( \frac{1092}{900} \) = 91/75 = \( \frac{91}{75} \)
Da frazione generatrice a numero decimale
Data una frazione, eseguendo la divisione tra numeratore e denominatore si ottiene un numero decimale. Ancor prima di eseguire la divisione è però possibile stabilire che tipo di numero decimale genera la frazione.
Prima si riduce la frazione ai minimi termini, poi si calcola la scomposizione in fattori primi del denominatore. A questo punto:
- se non ci sono fattori primi (il denominatore è 1) → numero intero (frazione apparente);
Esempio: 18/9 = 2/1. fattori primi denominatore: nessuno → 2
- se tra i fattori primi appaiono solo 2 e 5 → numero decimale limitato;
Esempio: 12/32 = 3/8. fattori primi denominatore: 2 → 0,375
- se tra i fattori primi non appaiono né il 2 né il 5 → numero decimale illimitato periodico semplice;
Esempio: 12/18 = 2/3. fattori primi denominatore: 3 → 0,6
- se tra i fattori primi appaiono altri numeri primi oltre al 2 o al 5 → numero decimale illimitato periodico misto.
Esempio: 2/12 = 1/6. fattori primi denominatore: 2 e 3 → 0,16
Come cambiano le regole se la base di destinazione non è 10 (ad esempio 2)?
Calcolo la frazione generatrice del numero in base 10, poi ricerco i fattori primi del denominatore.
- se non ci sono fattori primi (il denominatore è 1), ovvero se il numero in base 10 è intero → numero binario intero;
Esempio: 13 = 11012
- se fra i fattori c'è solo 2 → numero binario limitato;
Esempio: 0,25 = 25/100 = 1/4 = 0,012
- se fra i fattori primi non c'è il 2 → numero binario illimitato periodico semplice;
Esempio: 0,2 = 20/100 = 1/5 = 0,00112
- se fra i fattori primi ci sono sia il 2 che altri fattori → numero binario illimitato periodico misto;
Esempio: 0,3 = 30/100 = 3/10 = 0,010012
- Non otterrò mai un numero binario illimitato non periodico, vista la precisione finita del numero in input.
Algoritmo
// @brief Algoritmo (salvo errori)
// @author Roberto Foschini
// @date 31/01/2022
// @param $num di una frazione generatrice
// @param $den di una frazione generatrice
// semplifico la frazione
$g = gcd($num, $den);
$num /= $g;
$den /= $g;
// $lap = lunghezza antiperiodo (dipende solo da $den)
for ($lap=0; $den%2==0; ++$lap)
$den/=2;
// $lp = lunghezza periodo (dipende solo da $den)
for ($r=1, $lp=0; $r>1 || $lp==0; ++$lp)
$r = ($r*2) % $den;
// determino la tipologia di numero binario
if($den==1)
return $lap; // binario limitato con $lap cifre binarie
else {
if($lap==0)
return $lp; // binario illimitato periodico con $lp cifre binarie
else
return $lap, $lp; // binario illimitato misto con $lap|$lp cifre binarie
}
Strumenti