25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

2.3 Istruzioni di ripetizione 117<br />

IF (j500) EXIT outer<br />

IF (sum>100) EXIT inner<br />

END DO inner<br />

sum = sum+i<br />

i = i+10<br />

END DO outer<br />

PRINT*, ’sum = ’,sum<br />

END PROGRAM sommatoria<br />

2.3.4 Osservazioni sull’uso dei cicli<br />

E’ errore assai comune (e spesso molto meno ovvio di quanto si crede) quello di eseguire uno<br />

o più calcoli non ”indiciati” all’interno di un ciclo. <strong>Il</strong> seguente loop, ad esempio, è molto poco<br />

efficiente in quanto esegue il medesimo calcolo (la divisione per 4 della variabile pi e la radice<br />

quadrata del risultato) 10 volte:<br />

DO i = 1,10<br />

x(i) = x(i)*SQRT(pi/4.0) ! NB: x è un array: gli array saranno<br />

END DO ! trattati nel prossimo capitolo<br />

mentre sarebbe molto più efficiente calcolare il termine SQRT(pi/4.0) una sola volta all’esterno<br />

del ciclo dal momento che esso non dipende dall’indice i del loop (si parla in tal caso di loop<br />

invariant code motion). Così, ad esempio, è senz’altro preferibile sostituire il ciclo precedente<br />

con questo:<br />

factor = SQRT(pi/4.0)<br />

DO i=1,10<br />

x(i) = x(i)*factor<br />

END DO<br />

o, meglio ancora, con un’assegnazione in forma globale (quest’ultima soluzione, come si vedrà<br />

nel capitolo 3, è senz’altro da preferirsi ogni qualvolta le circostanze lo permettano):<br />

factor = SQRT(pi/4.0)<br />

x = x*factor<br />

C’è da dire che molti compilatori hanno la possibilità di eseguire questo tipo di ottimizzazione<br />

sul codice sorgente ogni qualvolta la sostituzione appaia ”ovvia”. Esistono, però, dei casi<br />

in cui l’interpretazione dell’invarianza di un fattore non è immediata, soprattutto in presenza<br />

di funzioni definite dall’utente. <strong>Il</strong> prossimo ciclo ne è un esempio:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!