Successivo: Tentare di arrotondare, Precedente: Inesattezza nei calcoli, Su: Cautela col calcolo in VM [Contenuti][Indice]
Può il calcolo con precisione arbitraria dare risultati esatti? Non ci sono risposte facili. Le regole standard dell’algebra spesso non valgono nei calcoli con precisione arbitraria. Tra le altre cose, le leggi distributiva e associativa non sono rispettate completamente, e l’ordine dell’operazione può essere importante per il calcolo. Errori di arrotondamento, perdite di precisione che si accumulano, e valori molto vicini allo zero sono spesso causa di problemi.
Quando gawk
verifica l’eguaglianza delle espressioni
‘0.1 + 12.2’ e ‘12.3’ usando l’aritmetica a doppia precisione della
macchina, decide che non sono uguali! (Vedi la sezione Fare attenzione quando si confrontano valori.)
Si può ottenere il risultato cercato aumentando la precisione; 56 bit in
questo caso sono sufficienti:
$ gawk -M -v PREC=56 'BEGIN { print (0.1 + 12.2 == 12.3) }' -| 1
Se aggiungere più bit è una buona cosa, aggiungerne ancora di più
è meglio?
Ecco cosa succede se si usa un valore di PREC
ancora più alto:
$ gawk -M -v PREC=201 'BEGIN { print (0.1 + 12.2 == 12.3) }' -| 0
Non è un bug di gawk
o della libreria MPFR.
È facile dimenticare che il numero finito di bit usato per memorizzare il
valore spesso è solo un’approssimazione dopo un opportuno arrotondamento. Il
test di uguaglianza riesce se e solo se tutti i bit dei due operandi
sono esattamente gli stessi. Poiché questo non è necessariamente vero dopo un
calcolo in virgola mobile con una determinata precisione e con una modalità di
arrotondamento valida, un test di eguaglianza convenzionale potrebbe non
riuscire. Invece, il test riesce confrontando i due numeri per vedere se la
differenza tra di loro rientra in un delta accettabile.
In applicazioni dove sono sufficienti fino a 15 cifre decimali, il calcolo in doppia precisione eseguito dall’hardware del computer può essere una buona soluzione, e in genere è più veloce. Però bisogna tener presente che ogni operazione in virgola mobile può subire un nuovo errore di arrotondamento con conseguenze catastrofiche, come si è visto nel precedente tentativo di calcolare il valore di pi. In tali casi una precisione supplementare può aumentare la stabilità e l’accuratezza del calcolo.
Oltre a ciò, bisogna tenere conto del fatto che addizioni ripetute non sono necessariamente equivalenti a una moltiplicazione nell’aritmetica in virgola mobile. Nell’esempio visto in Gli errori diventano sempre maggiori:
$ gawk 'BEGIN { > for (d = 1.1; d <= 1.5; d += 0.1) # ciclo eseguito cinque volte (?) > i++ > print i > }' -| 4
non è detto che, scegliendo per PREC
un valore arbitrariamente alto, si
riesca a ottenere il risultato corretto. La riformulazione del problema in
questione è spesso il modo corretto di comportari in tali situazioni.
Successivo: Tentare di arrotondare, Precedente: Inesattezza nei calcoli, Su: Cautela col calcolo in VM [Contenuti][Indice]