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.

1.7 Tipi di dati parametrizzati 55<br />

Si noti che il programma richiede, per la variabilevar2, una precisione di 13 cifre ed un range di<br />

200 potenze di 10, ma la variabile effettivamente assegnata dal processore ha una precisione di<br />

15 cifre ed un range di 307 potenze di 10. Questo tipo di variabile reale, infatti, è, nel processore<br />

in uso, quello di dimensione più piccola fra quelli che soddisfano o superano la specifica richiesta.<br />

Si vuole concludere il paragrafo con un esempio che mostra quale effetto possa avere sui<br />

risultati di un codice di calcolo la scelta di un parametro di kind piuttosto che un altro. Si farà<br />

riferimento, in particolare, al compilatore Intel <strong>Fortran</strong> Compiler ver. 5.0 per il quale le clausole<br />

KIND=4 e KIND=8 sono rappresentative di oggetti di tipo REAL rispettivamente in singola e in<br />

doppia precisione. <strong>Il</strong> programma che segue ha lo scopo di valutare la derivata numerica di una<br />

funzione f(x) secondo il metodo esplicito di Eulero:<br />

df<br />

dx<br />

= f(x + dx) − f(x)<br />

dx<br />

Si noti che il programma fa uso di particolari costrutti (come DO e IF) e di procedure interne<br />

che verranno trattate soltanto nei prossimi capitoli.<br />

PROGRAM derivate<br />

!---------------------------------------------------------------<br />

! Scopo: <strong>Il</strong>lustrare l’effetto della scelta del parametro di KIND<br />

! sull’accuratezza computazionale. Obiettivo del programma e’<br />

! valutare la derivata della finzione di test<br />

! f(x) = sin(2x)<br />

! usando passi dx decrescenti e confrontando i risultati via via<br />

! ottenuti con il risultato analitico.<br />

!---------------------------------------------------------------<br />

IMPLICIT NONE<br />

REAL(KIND=4) :: f1_4, f2_4, dfdx_4, x_4 = 2.3_4, dx_4 = 1<br />

REAL(KIND=8) :: f1_8, f2_8, dfdx_8, x_8 = 2.3_8, dx_8 = 1<br />

REAL(KIND=4) :: dfdx_exact_4<br />

REAL(KIND=8) :: dfdx_exact_8<br />

REAL(KIND=4) :: rel_err_4, abs_err_4<br />

REAL(KIND=8) :: rel_err_8, abs_err_8<br />

! Determina l’esatto valore della derivata<br />

dfdx_exact_4 = dfdx4(x_4)<br />

dfdx_exact_8 = dfdx8(x_8)<br />

! Scrive l’header della tabella di confronto<br />

WRITE(*,*) "NB: I confronti sono stati effettuati per x=2.3"<br />

WRITE(*,’(T6,A,T14,A,T26,A,T37,A,T48,A,T59,A)’) &<br />

"dx", "df/dx_ex", "df/dx_4", "rel_err", "df/dx_8", "rel_err"<br />

DO<br />

! Calcola la derivata numerica per KIND=4<br />

f2_4 = f4(x_4 + dx_4)<br />

f1_4 = f4(x_4)

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

Saved successfully!

Ooh no, something went wrong!