Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
INCERTEZZA NELLE VARIABILI REALI
Variabili reali – Errori di overflow e underflow
à
Intervallo di definizione un numero X in rappresentazione floating-point binaria, espresso secondo una
prestabilita mantissa costituita da N2 bits nella conversione da base p=2 a base p=10, darà luogo ad un solo numero
reale decimale (ad esempio A).
iamo come esempio un insieme di numeri a virgola mobile a base 10 (in un sistema metric
Viceversa, il numero binario, data la limitazione della mantissa, sarà ottenibile da un insieme di valori costituente un
male), caratterizzato da un esponente a 2 cifre, e una mantissa a 3 cifre significative con un
intervallo di numeri reali decimali (A1, A2) con A1<A<A2.
allo di valori definito tra 0,001 e 0,999 (con la prima cifra, lo zero, data per implicita, che
In altre parole, un numero in virgola mobile rappresenta un range di valori e non un valore; c’è un errore insito nel
o che accade quasi sempre con i numeri float): otterremo un insieme di numeri float che ris
fatto che si dispone di un numero limitato di bit per descrivere la mantissa. Se voglio diminuire questo errore devo
aumentare il numero di bit che uso per la mantissa.
viso in 7 "regioni" omogenee
à
Errori di overflow e underflow prendiamo come esempio un insieme di numeri a virgola mobile a base 10 (in un
sistema decimale), caratterizzato da un esponente a 2 cifre, e una mantissa a 3 cifre significative con un intervallo di
valori definito tra 0,001 e 0,999: otterremmo un insieme di numeri float che risulta suddiviso in 7 regioni omogenee.
-103 -103
-1 x 10 1 x 10
-99 -99
-0.001 x 10 0.001 x 10
Possono prodursi errori di overflow ma anche di underflow.
à
Errori di overflow in generale non sono rimediabili, se non spostando i confini delle regioni (aumentando le cifre
dell’esponente) e quindi il campo di esistenza di tutto l’insieme float. Per diminuire questi errori, devo aumentare i
bit con cui descrivo l’esponente.
à
Errori di underflow sono meno gravi poiché possono essere approssimati a zero.
SEZIONE 4: FORTRAN
Il linguaggio Fortran (Formula Translator) è nato negli anni ’50, per gestire librerie di programmi d’utilità, ed è stato
uno dei primi linguaggi di programmazione ad alto livello.
à Si colloca fra i linguaggi di alto livello, ma come uno dei più vicini alla struttura della macchina.
à Il corredo delle librerie di programmi di utilità è tra i più vasti disponibili.
à è utilizzato soprattutto per elaborazioni di calcolo numerico, dove l’efficienza e la velocità di esecuzione che esso
offre sono ritenuti più importanti rispetto ad altri aspetti del linguaggio. Per questo ben si adatta all’utilizzo in campo
scientifico.
Il limite principale del Fortran, nelle versioni vecchie, riguarda la strutturazione dei dati e la gestione statica della
memoria. Le caratteristiche che lo rendono molto popolare sono le seguenti:
• La possibilità di utilizzare numeri interi e reali con un elevato numero di cifre significative
• La possibilità di utilizzare i numeri complessi e l’aritmetica complessa
• L’esistenza di un gran numero di funzioni matematiche di libreria utilizzabili direttamente in qualsiasi
punto del programma o sottoprogramma
• La possibilità di costruire una propria libreria di sottoprogrammi già compilati e provati, riutilizzabili
• La possibilità di richiamare Function e Subroutine scritte in linguaggi differenti dal Fortran
STRUTTURA DI UN PROGRAMMA
Un programma Fortran ha la seguente struttura:
1. Sezione dichiarativa: è posizionata all’inizio e contiene istruzioni non eseguibili, quali: nome del
programma (PROGRAM) e dichiarazione delle variabili (REAL, INTEGER…)
2. Sezione esecutiva: rappresenta il corpo del programma e contiene le istruzioni eseguibili necessarie per
effettuare le operazioni per le quali il programma stesso è stato ideato
3. Sezione conclusiva: contiene le istruzioni che interrompono il programma, quali: STOP (interrompe il
programma in esecuzione), END PROGRAM (dice al compilatore che il programma è terminato in fase di
compilazione)
Il file di testo deve essere organizzato in 72 colonne. Le prime 6 devono essere lasciate libere per inserire
determinate informazioni. I commenti (non eseguibili) possono essere inseriti tramite la lettera “c”, o dal simbolo “*”
Esempio programma
in colonna 1, oppure da “!” (tutto ciò che è alla sua destra sarà ignorato).
Di seguito è riportato il
DEFINIRE LE VARIABILI
diagramma di flusso di un start
Le variabili definite nella parte dichiarativa di un programma
programma che legge due numeri
vengono dette variabili globali del programma poiché vengono
reali (a,b) ne fa la somma (c) e Leggi a,b
create all’inizio dell’elaborazione del programma, e distrutte solo
scrive il risultato se la somma è
alla fine di esso. Si può dire che le variabili globali siano create al
tempo di compilazione, nel senso che quando il programma viene
maggiore di 0, se è minore di 0 c=a+b
caricato in memoria centrale per l’esecuzione, insieme ad esso
scrive ‘somma inferiore a 0’:
viene caricato (allocato) anche lo spazio per le variabili reali. si no
c >0
à
Esempio del programma somma Scrivi c Scrivi somma inferiore a 0
stop
program somma
real a,b,c
write(*,*) 'immetti i valori di a e b(separati da,) premi invio'
read(*,*) a,b
c=a+b
if(c.ge.0) then
write(*,*) 'somma=',c
else
Si può assegnare alle variabili nomi qualsiasi a patto di write(*,*) 'somma inferiore a 0'
endif
rispettare alcune regole: end
• Primo carattere: una lettera
• Caratteri successivi: lettere e numeri (no caratteri speciali)
• Spazi vuoti non ammessi
• Le variabili che iniziano con I,J,K,L,M,N sono dichiarati numeri interi (comando Integer). Le altre sono
numeri a virgola mobile (comando Real)
• Biunivocità: un nome una variabile, una variabile un nome
• La variabile deve essere inizializzata
• I comandi Fortran non possono essere usati come nome di variabili (read, write, stop…)
à
Variabili intere il compilatore assegna automaticamente 4 byte alle variabili intere che quindi possono assumere
valori compresi tra -2147483648 e +2147483647. La sintassi con cui si definiscono sarà:
INTEGER nome_variabile (di 32 bit)
INTEGER*2 nome_variabile (di 16 bit)
INTEGER*8 nome_variabile (di 64 bit)
Queste definizioni vanno inserite nella parte dichiarativa del programma, quindi all’inizio.
à
Variabili reali possiamo definire le variabili in singola (4 byte) o doppia precisione (8 byte):
REAL nome_variabile (singola precisione)
REAL*8 nome_variabile (doppia precisione)
à
Variabili complesse sono definite implicitamente con due numeri reali da 4 byte ciascuno; quindi, ogni numero
Variabili sunto
complesso impegnerà di default 8 byte. La sintassi è:
COMPLEX nome_variabile (due numeri da 4 byte)
COMPLEX*8 nome_variabile (due numeri da 8 byte) Se voglio dare da input il valore ad una variabile
complessa non posso dire semplicemente (read(*,*)
nome_variabile). Devo prima leggere due variabili reali e
poi allocarle nella variabile complessa mediante il
comando CMPLX. Un esempio di sequenza di comandi
per questo scopo è il seguente:
read(*,*) parte_reale,parte_immag
nome_variabile=CMPLX(parte_reale,parte_immag)
à
Variabili logiche possono assumere solo due valori:
true or false. Occupano un solo bit.
LOGICAL nome_variabile
nome_variabile=.true. o nome_variabile=.false.
à
Variabili stringhe è possibile memorizzare dei caratteri. In fortran va definita la lunghezza della stringa. La sintassi
sarà:
CHARACTER*n nome_variabile
Dove n rappresenta il numero di caratteri da cui è composta la stringa. Ogni variabile stringa occuperà n*8 bit (nella
convenzione ASCII)
OPERAZIONI ARITMETICHE
Come operazioni elementari avremo:
• X+Y = somma
• X-Y = differenza
• X*Y = prodotto
• X/Y = quoziente
• X**m = potenza m-esima di X (m intero)
• X**Y = esponenziale
Oltre alle operazioni fondamentali, possiamo richiamare un certo numero di funzioni intrinseche (build-in functions).
Le più comuni sono:
• Sin, cos, tan
• Asin, acos
• Log
• Exp
• Sqrt (radice quadrata)
• Abs (valore assoluto)
COMANDO “IF”
Nell’utilizzo più semplice, il comando “IF” presenta la seguente sintassi:
if(variabile1.xx.variabile2) then
elseif() then
else
endif
Le seguenti istruzioni permetto di confrontare tra di loro due variabili:
• X.eq.Y = vera se X=Y, falsa altrimenti
• X.ne.Y = vera se X¹Y, falsa altrimenti
• X.gt.Y = vera se X>Y, falsa altrimenti
• X.lt.Y = vera se X<Y, falsa altrimenti
• X.ge.Y = vera se X³Y, falsa altrimenti
• X.le.Y = vera se X£Y, falsa altrimenti
Si notino i punti (.) che intervengono sempre nella definizione degli operandi. Nel caso delle variabili stringa, le
variabili vanno indicate tra gli apostrofi singoli. Ad esempio( if(a.eq.’ciao’) then), vuol dire che la condizione è
verificata se la variabile stringa “a” assume il valore di “ciao”.
à
Operazioni logiche ci sono relazioni che intercorrono fra variabili logiche. Siano X e Y due variabili logiche, allora:
.not.x = è vera solo se la condizione X non è verificata, falsa se X è verificata
X.and.Y = vera se X e Y sono vere contemporaneamente, falsa altrimenti
X.or.Y = vera se X o Y sono vere, falsa altrimenti
Una sintassi tipica sarà:
if(cond_1.or.cond_2) then ……. Endif.
ORGANIZZAZIONE DEI DATI
Vedremo com’è possibile organizzare un insieme di dati tramite: array, liste, file.
à
Array costituiscono un modo di memorizzare dati omogenei (ad esempio un insieme di numeri reali). Per accedere
ai diversi elementi di un array basta sapere la posizione in memoria del primo elemento dell’array ed il numero di
posizione dell’array dell’elemento cercato.
Posizione elemento cercato = pos. primo elemento + lungh. elemento * num. elemento cercato
Questo modo di organizzare gli insiemi di dati si adatta bene alla modalità di accesso casuale tipico della memoria
RAM.
à
File nel caso di memorie di massa ad accesso non casuale, è più comodo memorizzare i dati in elenchi organizzati
detti file. Il file è estensibile, cioè è possibile aggiung