Successivo: Controllare disponibilità MPFR, Precedente: Cautela col calcolo in VM, Su: Calcolo con precisione arbitraria [Contenuti][Indice]
gawk
Quando viene specificata l’opzione -M,
gawk
esegue tutti i calcoli sui numeri interi usando gli interi a
precisione arbitraria della libreria GMP. Qualsiasi numero che appaia come un
intero in un sorgente o in un file-dati è memorizzato come intero a precisione
arbitraria. La dimensione del numero intero ha come limite solo la memoria
disponibile. Per esempio, il seguente programma calcola
5432,
il cui risultato è oltre i limiti degli ordinari valori in virgola mobile a
doppia precisione dei processori:
$ gawk -M 'BEGIN { > x = 5^4^3^2 > print "numero di cifre =", length(x) > print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20) > }' -| numero di cifre = 183231 -| 62060698786608744707 ... 92256259918212890625
Se invece si dovesse calcolare lo stesso valore usando valori in virgola mobile con precisione arbitraria, la precisione necessaria per il risultato corretto (usando la formula ‘prec = 3.322 * dps’) sarebbe 3.322 x 183231, o 608693.
Il risultato di un’operazione aritmetica tra un intero e un valore in virgola mobile è un valore in virgola mobile con precisione uguale alla precisione di lavoro. Il seguente programma calcola l’ottavo termine nella successione di Sylvester106 usando una ricorrenza:
$ gawk -M 'BEGIN { > s = 2.0 > for (i = 1; i <= 7; i++) > s = s * (s - 1) + 1 > print s > }' -| 113423713055421845118910464
Il risultato mostrato differisce dal numero effettivo, 113.423.713.055.421.844.361.000.443, perché la precisione di default di 53 bit non è suffciente per rappresentare esattamente il risultato in virgola mobile. Si può o aumentare la precisione (in questo caso bastano 100 bit), o sostituire la costante in virgola mobile ‘2.0’ con un intero, per eseguire tutti i calcoli usando l’aritmetica con gli interi per ottenere l’output corretto.
A volte gawk
deve convertire implicitamente un intero con precisione
arbitraria in un valore in virgola mobile con precisione arbitraria.
Ciò si rende necessario
principalmente perché la libreria MPFR non sempre prevede l’interfaccia
necessaria per elaborare interi a precisione arbitraria o numeri di tipo
eterogeneo come richiesto da un’operazione o funzione. In tal caso, la
precisione viene impostata al minimo valore necessario per una conversione
esatta, e non viene usata la precisione di lavoro. Se
questo non è quello di cui si ha bisogno o che si vuole, si può ricorrere a un
sotterfugio e convertire preventivamente l’intero in un valore in virgola
mobile, come qui di seguito:
gawk -M 'BEGIN { n = 13; print (n + 0.0) % 2.0 }'
Si può evitare completamente questo passaggio specificando il numero come valore in virgola mobile fin dall’inizio:
gawk -M 'BEGIN { n = 13.0; print n % 2.0 }'
Si noti che, per questo specifico esempio, probabilmente è meglio semplicemente specificare:
gawk -M 'BEGIN { n = 13; print n % 2 }'
Dividendo due interi a precisione arbitraria con ‘/’ o con ‘%’, il risultato è tipicamente un valore in virgola mobile con precisione arbitraria (a meno che il risultato non sia un numero intero esatto).
Weisstein, Eric W. Sylvester’s Sequence. From MathWorld — A Wolfram Web Resource (http://mathworld.wolfram.com/SylvestersSequence.html).
Successivo: Controllare disponibilità MPFR, Precedente: Cautela col calcolo in VM, Su: Calcolo con precisione arbitraria [Contenuti][Indice]