Successivo: Funzioni per stringhe, Precedente: Chiamare funzioni predefinite, Su: Funzioni predefinite [Contenuti][Indice]
La seguente lista descrive tutte le funzioni predefinite che hanno a che fare con i numeri. I parametri opzionali sono racchiusi tra parentesi quadre ([ ]):
atan2(y, x)
Restituisce l’arcotangente di y / x
in radianti.
Si può usare ‘pi = atan2(0, -1)’ per ottenere il valore di
pi greco.
cos(x)
Restituisce il coseno di x, con x in radianti.
exp(x)
Restituisce l’esponenziale di x (e ^ x
) o un messaggio
di errore se x è fuori dall’intervallo consentito.
L’intervallo entro il quale può variare x
dipende dalla rappresentazione dei numeri in virgola mobile nella macchina in
uso.
int(x)
Restituisce l’intero più vicino a x, situato tra x e zero,
troncato togliendo i decimali.
Per esempio, int(3)
è 3, int(3.9)
è 3, int(-3.9)
è -3, e int(-3)
è ancora -3.
log(x)
Restituisce il logaritmo naturale di x, se x è positivo;
altrimenti, restituisce NaN
(“not a number”) sui sistemi che
implementano lo standard IEEE 754.
Inoltre, gawk
stampa un messaggio di avvertimento qualora x
sia negativo.
rand()
Restituisce un numero casuale. I valori di rand()
sono
uniformemente distribuiti tra zero e uno.
Il valore potrebbe essere zero ma non è mai uno.45
Spesso servono dei numeri casuali interi invece che frazionari. La seguente funzione definita dall’utente può essere usata per ottenere un numero casuale non negativo inferiore a n:
function randint(n) { return int(n * rand()) }
La moltiplicazione produce un numero casuale maggiore o uguale a zero e
minore di n
. Tramite int()
, questo risultato diventa
un intero tra zero e n
- 1, estremi inclusi.
Il seguente esempio usa una funzione simile per generate interi casuali fra uno e n. Il programma stampa un numero casuale per ogni record in input:
# funzione per simulare un tiro di dado. function roll(n) { return 1 + int(rand() * n) } # Tira 3 dadi a sei facce e # stampa il numero di punti. { printf("%d punteggio\n", roll(6) + roll(6) + roll(6)) }
ATTENZIONE: Nella maggior parte delle implementazioni di
awk
, compresogawk
,rand()
inizia a generare numeri casuali partendo sempre dallo stesso numero, o seme, per ogni invocazione diawk
.46 È per questo motivo che un programma genera sempre gli stessi risultati ogni volta che lo si esegue. I numeri sono casuali all’interno di una singola esecuzione diawk
ma "prevedibili" in ogni successiva esecuzione. Ciò torna utile in fase di test, ma se si desidera che un programma generi sequenze differenti di numeri casuali ogni volta che è chiamato, occorre impostare il seme a un valore che cambi per ogni esecuzione. Per fare questo, è prevista la funzionesrand()
.
sin(x)
Restituisce il seno di x, con x espresso in radianti.
sqrt(x)
Restituisce la radice quadrata positiva di x.
gawk
stampa un messaggio di avvertimento
se x è un numero negativo. Quindi, sqrt(4)
vale 2.
srand(
[x])
Imposta al valore x il numero di partenza, o seme, utilizzato per generare numeri casuali.
Ogni seme genera una sequenza particolare di numeri casuali.47 Quindi, impostando il seme allo stesso valore una seconda volta, viene prodotta ancora la stessa sequenza di numeri casuali.
ATTENZIONE: Differenti implementazioni di
awk
usano internamente differenti generatori di numeri casuali. Non si deve dare per scontato che lo stesso programmaawk
generi la stessa serie di numeri casuali se viene eseguito da differenti versioni diawk
.
Se si omette l’argomento x, scrivendo ‘srand()’, viene usato come seme la data e ora corrente. È questo il modo per ottenere numeri casuali che sono veramente imprevedibili.
Il valore restituito da srand()
è quello del seme precedente.
Questo per facilitare il monitoraggio dei semi, nel caso occorra riprodurre
in maniera coerente delle sequenze di numeri casuali.
POSIX non specifica quale debba essere il seme iniziale, che quindi varia
a seconda delle implementazioni awk
.
La versione C di
rand()
in molti sistemi Unix genera notoriamente delle sequenze
piuttosto mediocri di numeri casuali. Tuttavia, non è scritto da nessuna
parte che un’implementazione di awk
debba necessariamente
usare la funzione rand()
del linguaggio C per implementare
la versione awk
di rand()
. In effetti, gawk
ha usato per parecchi anni la funzione random()
di BSD, che è
notevolmente migliore di rand()
, per generare dei numeri casuali.
Dalla versione 4.1.4, grazie al contributo di Nelson H.F.
Beebe, gawk
usa l’algoritmo di rimescolamento nella scatola
di Bayes-Durham, che estende in maniera notevole il periodo dopo il
quale i numeri si ripetono ed elimina le correlazioni a breve distanza
e a lunga distanza che potrebbero esistere nel generatore originale
di numeri casuali.
mawk
usa un seme differente ogni volta.
I numeri casuali generati da un computer non sono veramente casuali. Tecnicamente sono conosciuti come numeri pseudo-casuali. Ciò vuol dire che, anche se i numeri in una sequenza sembrano casuali, è possibile in realtà generare la stessa sequenza di numeri casuali più e più volte.
Successivo: Funzioni per stringhe, Precedente: Chiamare funzioni predefinite, Su: Funzioni predefinite [Contenuti][Indice]