Successivo: Sommario virgola mobile, Precedente: Controllare disponibilità MPFR, Su: Calcolo con precisione arbitraria [Contenuti][Indice]
Per diverso tempo, awk ha convertito le stringhe dall’aspetto non
numerico nel valore numerico zero, quando richiesto. Per di più, la
definizione originaria del linguaggio e lo standard POSIX originale prevedevano
che awk riconoscesse solo i numeri decimali (base 10), e non i numeri
ottali (base 8) o esadecimali (base 16).
Le modifiche nel linguaggio degli standard POSIX 2001 e 2004 possono essere
interpretate nel senso che awk debba fornire delle funzionalità
aggiuntive. Queste sono:
0xDEADBEEF). (Da notare: valore dei dati letti,
non costanti facenti parte del codice sorgente.)
Il primo problema è che entrambe le modifiche sono deviazioni evidenti dalla prassi consolidata:
gawk crede che supportare i valori in virgola mobile
esadecimali, nello specifico, sia sbagliato, e che non sia mai stata intenzione
dell’autore originale di introdurlo nel linguaggio.
Il secondo problema è che il manutentore di gawk crede che questa
interpretazione dello standard, che richiede una certa dimestichezza col
linguaggio giuridico per essere compresa, non sempre è stata
colta dai normali sviluppatori. In altre parole, “Sappiamo come siete
arrivati sin qui, ma non pensiamo che questo sia il posto dove volete essere.”
Recependo queste argomentazioni, e cercando nel contempo di assicurare la
compatibilità con le versioni precedenti dello standard, lo standard POSIX 2008
ha aggiunto delle formulazioni esplicite per consentire l’uso da parte di
awk, solo a richiesta, dei valori in virgola mobile esadecimali e
dei valori speciali
“not a number” e infinito.
Sebbene il manutentore di gawk continui a credere che introdurre
queste funzionalità sia sconsigliabile, ciò nonostante, sui sistemi che
supportano i valori in virgola mobile IEEE, sembra giusto fornire
qualche
possibilità di usare i valori NaN e infinito. La soluzione implementata
in gawk è questa:
gawk non
interviene. I valori di stringa sono passati direttamente alla funzione
strtod() della libreria di sistema, e se quest’ultima restituisce
senza errori un valore numerico,
esso viene usato.107
Per definizione, i risultati non sono portabili su diversi sistemi;
e sono anche piuttosto sorprendenti:
$ echo nanny | gawk --posix '{ print $1 + 0 }'
-| nan
$ echo 0xDeadBeef | gawk --posix '{ print $1 + 0 }'
-| 3735928559
gawk interpreta i quattro valori di stringa
‘+inf’,
‘-inf’,
‘+nan’
e
‘-nan’
in modo speciale, producendo i corrispondenti valori numerici speciali.
Il segno iniziale serve per segnalare a gawk (e all’utente)
che il valore è realmente numerico. I numeri in virgola mobile esadecimali
non sono consentiti (a meno di non usare anche --non-decimal-data,
che non è consigliabile). Per esempio:
$ echo nanny | gawk '{ print $1 + 0 }'
-| 0
$ echo +nan | gawk '{ print $1 + 0 }'
-| +nan
$ echo 0xDeadBeef | gawk '{ print $1 + 0 }'
-| 0
gawk ignora la distinzione maiuscole/minuscole nei quattro valori
speciali. Così, ‘+nan’ e ‘+NaN’ sono la stessa cosa.
Oltre a gestire l’input, gawk deve anche stampare valori
“corretti” in output, quando un valore sia NaN o infinito.
A partire dalla versione 4.2.2, per tali valori
gawk stampa una delle quattro stringhe sopra descritte:
‘+inf’, ‘-inf’, ‘+nan’, or ‘-nan’.
Analogamente,se usato in modalità POSIX, gawk stampa il risultato
della funzione C di sistema printf() usando la stringa di formato
%g per il valore, quale che esso sia.
Successivo: Sommario virgola mobile, Precedente: Controllare disponibilità MPFR, Su: Calcolo con precisione arbitraria [Contenuti][Indice]