Successivo: , Precedente: , Su: Cautela col calcolo in VM   [Contenuti][Indice]


16.4.2 Ottenere la precisione voluta

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: , Precedente: , Su: Cautela col calcolo in VM   [Contenuti][Indice]