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


16.4.1.1 Molti numeri non possono essere rappresentati esattamente

Perciò, prima di iniziare a scrivere del codice, si dovrebbe pensare al risultato che si vuole effettivamente ottenere e a cosa realmente accade. Si considerino i due numeri nel seguente esempio:

x = 0.875             # 1/2 + 1/4 + 1/8
y = 0.425

Diversamente dal numero in y, il numero memorizzato in x è rappresentabile esattamente nel formato binario, perché può essere scritto come somma finita di una o più frazioni i cui denominatori sono tutti multipli di due. Quando gawk legge un numero in virgola mobile dal sorgente di un programma, arrotonda automaticamente quel numero alla precisione, quale che sia, supportata dal computer in uso. Se si tenta di stampare il contenuto numerico di una variabile usando una stringa di formato in uscita di "%.17g", il valore restituito può non essere lo stesso numero assegnato a quella variabile:

$ gawk 'BEGIN { x = 0.875; y = 0.425
>               printf("%0.17g, %0.17g\n", x, y) }'
-| 0.875, 0.42499999999999999

Spesso l’errore è talmente piccolo da non essere neppure notato, e se è stato notato, si può sempre specificare il grado di precisione si vuole nell’output. In genere questo è una stringa di formato come "%.15g" che, se usata nell’esempio precedente, dà luogo a un output identico all’input.