Successivo: , Precedente: , Su: Funzioni predefinite   [Contenuti][Indice]


9.1.2 Funzioni numeriche

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, compreso gawk, rand() inizia a generare numeri casuali partendo sempre dallo stesso numero, o seme, per ogni invocazione di awk.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 di awk 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 funzione srand().

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 programma awk generi la stessa serie di numeri casuali se viene eseguito da differenti versioni di awk.

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.


Note a piè di pagina

(45)

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.

(46)

mawk usa un seme differente ogni volta.

(47)

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: , Precedente: , Su: Funzioni predefinite   [Contenuti][Indice]