Precedente: , Su: Inesattezza nei calcoli   [Contenuti][Indice]


16.4.1.3 Gli errori diventano sempre maggiori

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