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


16.4.4 Impostare la precisione

gawk usa una precisione di lavoro a livello globale; non tiene traccia della precisione e accuratezza dei singoli numeri. Eseguendo un’operazione aritmetica o chiamando una funzione predefinita, il risultato viene arrotondato alla precisione di lavoro. La precisione di lavoro di default è di 53 bit, modificabile usando la variabile predefinita PREC. Si può anche impostare il valore a una delle stringhe predefinite (non importa se scritte in maiuscolo o minuscolo) elencate in Tabella 16.4, per emulare un formato binario che segue lo standard IEEE 754.

PRECformato binario IEEE 754
"half"16-bit mezza precisione
"single"32-bit singole precisione di base
"double"64-bit doppia precisione di base
"quad"128-bit quadrupla precisione di base
"oct"256-bit ottupla precisione

Tabella 16.4: Stringhe di precisione predefinita per PREC

Il seguente esempio illustra gli effetti del cambiamento di precisione sulle operazioni aritmetiche:

$ gawk -M -v PREC=100 'BEGIN { x = 1.0e-400; print x + 0
>   PREC = "double"; print x + 0 }'
-| 1e-400
-| 0

ATTENZIONE: Diffidare delle costanti in virgola mobile! Quando si legge una costante in virgola mobile dal codice sorgente di un programma, gawk usa la precisione di default (quella del formato double di C), a meno che non venga richiesto, tramite la variabile speciale PREC fornita sulla riga di comando, di memorizzarla internamente come un numero MPFR. Cambiare la precisione tramite PREC nel testo del programma non cambia la precisione di una costante.

Se si deve rappresentare una costante in virgola mobile con una precisione maggiore di quella di default e non è possibile usare un assegnamento a PREC da riga di comando, si dovrebbe definire la costante o come stringa, o come numero razionale, ove possibile. L’esempio seguente illustra le differenze tra i diversi modi di stampare una costante in virgola mobile:

$ gawk -M 'BEGIN { PREC = 113; printf("%0.25f\n", 0.1) }'
-| 0.1000000000000000055511151
$ gawk -M -v PREC=113 'BEGIN { printf("%0.25f\n", 0.1) }'
-| 0.1000000000000000000000000
$ gawk -M 'BEGIN { PREC = 113; printf("%0.25f\n", "0.1") }'
-| 0.1000000000000000000000000
$ gawk -M 'BEGIN { PREC = 113; printf("%0.25f\n", 1/10) }'
-| 0.1000000000000000000000000

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