Precedente: Confronti tra valori in VM, Su: Inesattezza nei calcoli [Contenuti][Indice]
La perdita di accuratezza in un singolo calcolo con numeri in virgola mobile generalmente non dovrebbe destare preoccupazione. Tuttavia, se si calcola un valore che è una sequenza di operazioni in virgola mobile, l’errore si può accumulare e influire sensibilmente sul risultato del calcolo stesso. Qui sotto vediamo un tentativo di calcolare il valore di pi usando una delle sue rappresentazioni come somma di una serie di numeri:
BEGIN { x = 1.0 / sqrt(3.0) n = 6 for (i = 1; i < 30; i++) { n = n * 2.0 x = (sqrt(x * x + 1) - 1) / x printf("%.15f\n", n * x) } }
Quando viene eseguito, gli errori iniziali si propagano nei calcoli successivi, facendo terminare il ciclo prematuramente dopo un tentativo di divisione per zero:
$ gawk -f pi.awk -| 3.215390309173475 -| 3.159659942097510 -| 3.146086215131467 -| 3.142714599645573 … -| 3.224515243534819 -| 2.791117213058638 -| 0.000000000000000 error→ gawk: pi.awk:6: fatale: tentativo di dividere per zero
Ecco un altro esempio in cui l’inaccuratezza nelle rappresentazioni interne porta a un risultato inatteso:
$ gawk 'BEGIN { > for (d = 1.1; d <= 1.5; d += 0.1) # esegue il ciclo cinque volte (?) > i++ > print i > }' -| 4