Successivo: Confronti tra valori in VM, Su: Inesattezza nei calcoli [Contenuti][Indice]
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.