Successivo: Sommario virgola mobile, Precedente: Interi a precisione arbitraria, 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 a 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 a 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.105
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 a 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.
Successivo: Sommario virgola mobile, Precedente: Interi a precisione arbitraria, Su: Calcolo con precisione arbitraria [Contenuti][Indice]