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]