Come è possibile far calcolare le cifre di pigreco ad un calcolatore? So che esistono molti algoritmi equivalenti, più o meno buoni, basati sugli sviluppi in serie, ma non è questo il problema… Come si trovano milioni di cifre decimali, se la precisione di un calcolatore è costituita da un numero finito di bit? E’ possibile trovarle con un PC?

Per rispondere a questa domanda, devo prima chiarire alcuni punti
riguardanti la finitezza del numero dei bit.  Infatti è vero
che i bit usati da un calcolatore per rappresentare i numeri sono finiti,
ma questo non è un limite per gli algoritmi. Tutti i computer e
le macchine digitali per il calcolo numerico, usano per rappresentare i
numeri reali diverse decine di bit(di norma 64 bit), questo però
non significa che non se ne possano usare molti di più. 

Quando cerchiamo di rappresentare una certa quantità, non facciamo
altro che applicare il sistema metrico decimale, ossia realizziamo delle
sequenze di cifre, ognuna delle quali è uno dei simboli dell’insieme
che abbiamo deciso di usare. Insieme che nel sistema decimale è
composto, come dice il nome, da dieci simboli : {0,1,2,3,4,5,6,7,8,9}.
A cui assegniamo un peso diverso a seconda della sua posizione, che calcoliamo
elevando la base del sistema (10) alla potenza data dalla posizione della
cifra. 

Forse sono stato un po’ troppo accademico, ma spero che con questo
esempio tutto sarà più chiaro.  Prendiamo il numero
1653, e consideriamolo nel modo che ho appena descritto : 

Peso:   103 102 101 100  

Cifra:   1   6  5  3 

Per determinare il valore della sequenza basta moltiplicare il peso
delle cifre per quello della cifra stessa e sommare il tutto. 

Valore: 1000*1+100*6+10*5+1*3=1653 

Ora se volessimo rappresentare i numeri reali, avremmo bisogno di estendere
i pesi verso destra, continuando a decrementare l’esponente : 10-1,
10-2, 10-3, … ottenendo tutte le cifre decimali
che vogliamo. 

In modo analogo operano i computer solo che, anziché usare il
sistema decimale, usano quello binario. Quindi il loro insieme di cifre
è composto solo di due simboli :{0,1}, e di conseguenza i pesi si
otterranno con le potenze di 2 dato che due è la base del sistema. 

Peso:   23 22 21 20
2-1 2-2 2-3
 

Cifra:  1  0 1  1  0  1   0 

Valore: 8*1+4*0+2*1+1*1+0.5*0+0.25*1+0.125*0=11.25 

In questo esempio ho usato una rappresentazione a 7 bit, dove tra il
quarto e il quinto bit abbiamo posto la nostra ipotetica virgola. Questa
è quella che viene chiamata una rappresentazione a virgola fissa,
che può far capire il meccanismo, ma in realtà la rappresentazione
più usata è quella in virgola mobile, un po’ più complicata
da spiegare, ma se interessa lo studente posso anche affrontare successivamente. 

Dall’ultimo esempio si può notare che la precisione massima
è di 1/8, ma come dicevo prima basta aggiungere altri bit a destra
per aumentarla, o in alternativa spostare la virgola verso sinistra, ma
facendo in questo modo riduciamo il numero massimo rappresentabile. 

Per quanto riguarda l’ultimo quesito la risposta è SI. A questo
proposito non posso trattenermi dal ribadire che non esiste nessuna limitazione
agli algoritmi eseguibili su un PC, se non dovuto alla loro potenza di
calcolo, ossia alla velocità di elaborazione. Infatti alcuni algoritmi
possono essere troppo “pesanti”, nel senso che eseguiti su un PC richiederebbero
per il loro completamento anni o addirittura secoli. 

Ritornando al problema di prima, ho già detto che normalmente
si usano 64 bit, questo perché con 64 bit si possono rappresentare
numeri molto grandi(o piccoli). Tanto per impressionare il lettore riporto
il range dei numeri rappresentabili con 64 bit in virgola mobile : da +1.7*10308
a -1.7*10-308 con una precisione di 15 cifre decimali. I calcoli
con questi numeri sono piuttosto laboriosi, per questo motivo gli algoritmi
per la loro manipolazione non vengono eseguiti dal microprocessore, ma
da circuiti appositamente progettati. 

In problemi specifici come quello del calcolo di numeri con precisione
arbitraria, purtroppo questi circuiti non possono essere usati nel modo
usuale, e quindi i poveri programmatori devono riscrivere gli algoritmi
eliminando tutti i limiti sullo spazio(numero di byte) usato per registrare
una quantità, quindi un numero potrebbe occupare ben più
di 8 byte (64 bit), fino a usarne molte decine o anche di più. 

Ho
letto la risposta alla domanda “com’e’ possibile far calcolare le cifre
di pigreco ad un calcolatore… Come si trovano milioni di cifre decimali…..”
e la risposta, molto chiara e completa, era imperniata sulla rappresentazione
in virgola fissa; vorrei avere la spiegazione anche per la rappresentazione
in virgola mobile.

La formula che sta alla base della rappresentazione
in virgola mobile è la stessa della notazione scientifica dei numeri,
ossia: N=Mxe dove N è il numero da rappresentare,
M la frazione o mantissa, x la base numerica(che nel nostro
caso sarà 2, visto che il numero è rappresentato in binario),
ed e è l’esponente.

Per capire la notazione in virgola mobile, analizziamo
la procedura usata per convertire i numeri. E quindi vediamo che nella
notazione scientifica 2.500.000.000 si può scrivere come 2,5*109.
Ma cosa abbiamo fatto per raggiungere questo risultato? Semplicemente abbiamo
spostato la virgola fino alla prima cifra significativa e abbiamo aggiunto
all’esponente, il numero di cifre attraversate dalla virgola.

La prima cosa da evidenziare è che qualsiasi
numero si può scrivere come: x = x/1*1 = x/100*100.
Quindi se registriamo il risultato della frazione e dell’esponente, possiamo
ottenere infinite rappresentazioni di un qualsiasi numero. Infatti aumentando
il valore dell’esponente otterremo tutte rappresentazioni diverse dello
stesso numero.

2 500 000 000/100*100 Þ
2500000000 * 100 Þ (2500000000,0)

2 500 000 000/101*101 Þ
250000000 * 101 Þ (250000000,1)

2 500 000 000/102*102 Þ
2500000 * 102 Þ (25000000,2)

2 500 000 000/108*108 Þ
25 * 108 Þ (25,8)

Nella rappresentazione in virgola mobile avviene
la stessa cosa, dove i bit vengono mappati in modo che il primo rappresenti
il segno, e i successivi divisi in due gruppi, uno per l’esponente e l’altro
per la mantissa.

S
1..7
8..31


In questa particolare mappatura, abbiamo 24 bit per
la mantissa che ci permettono di rappresentare tutti i numeri da 0 a 224–1
= 16 777 215 che corrispondono a 7 cifre decimali, con un esponente di
7 bit(0..127) che viene rappresentato in complemento a due, cioè
in modo che i valori possibili vengano considerati positivi da 0 a 63 e
negativi da 64 a 127.

La rappresentazione in complemento a due, potrebbe
sembrare bizzarra visto che si sarebbe potuto usare un bit per il segno,
ma senza entrare nei particolari, per motivi relativi all’hardware risultano
molto più semplici da manipolare.

Ma come al solito arrivo alla fine con i numeri
che stupiscono, infatti con una rappresentazione a 32 bit mappati nel modo
precedente, possiamo rappresentare un range di valori che vanno da ±
1,6*10-64 a ± 1.6*1063
con una precisione di 7 cifre decimali significative. Mentre con una rappresentazione
in virgola fissa, posta nel centro(tra il bit 15 e 16), saremmo arrivati
± 32768(circa ±
3,2*104), con una precisione di 8 cifre(4 per gli interi e 4
per i decimali). Per cui è chiaro il vantaggio che si ha nell’adottare
la rappresentazione in virgola mobile, con cui si ha meno precisione, ma
con la possibilità di rappresentare numeri infinitamente più
grandi o più piccoli.