Sei sulla pagina 1di 10

1

Espressioni e
funzioni mat emat iche
Ver. 2.4
2010 - Claudio Fornaro - Corso di programmazione in C
2
Espressioni numeriche
Compost e da operat ori, variabili, cost ant i e
funzioni, producono un valore
Delta = b*b-4*a*c;
Gli operat ori mat emat ici sono:
+ somma x = a + b;
- sot t razione x = a - b;
* molt iplicazione x = a * b;
/ divisione x = a / b;
% rest o della divisione int era x = a % b;
La divisione t ra int eri produce risult at o int ero
con t roncament o della part e frazionaria
I l rest o pu essere calcolat o solo con
operandi di t ipo int ero (non float ing-point )
3
Precedenza degli operat ori
Le regole di precedenza (o priorit ) specificano
in quale ordine vengono eseguit i i calcoli
Raggruppat i in livelli di priorit decrescent e:
1. + segno
2. ()
3. * / %
4. + somma e sot t razione
Esempi
x = a+b*c; prima la molt iplicazione
x = (a+b)*c; prima la somma
x = a + -b; a + (-b)
4
Associat ivit degli operat ori
Le regole di associat ivit specificano in quale
ordine vengono eseguit i i calcoli cont enent i
operat ori con lo st esso livello di precedenza
Per gli operat ori mat emat ici lassociat ivit
sempre da sinist ra a dest ra
x=a+b+c; x=(a+b)+c;
x=a+b-c+d; x=(((a+b)-c)+d);
x=a*b/c; x=(a*b)/c;
x=a+b+c*d; x=((a+b)+(c*d));
5
Overflow e alt re eccezioni
La gest ione delloverflow, della divisione per 0
e delle alt re eccezioni (errori al run-t ime) nella
valut azione delle espressioni non definit a
dal linguaggio (undefined behavior ), ma
dipende dallimplement azione (ossia dal
compilat ore)
6
Espressioni numeriche
Operandi dello st esso t ipo
Le operazioni mat emat iche possono essere
eseguit e solo t ra due operandi dello st esso
t ipo (int con int, long con long, float
con float, double con double, et c.)
I risult at i int ermedi dei calcoli vengono
memorizzat i in variabili t emporanee (senza
nome) dello st esso t ipo degli operandi
Le variabili t emporanee vengono rimosse
aut omat icament e dalla memoria dopo essere
st at e ut ilizzat e
7
Espressioni numeriche
Operandi dello st esso t ipo
o e | sono le variabili t emporanee
X = A + B * C
o
|
8
Espressioni numeriche
Operandi di t ipo diverso
Le operazioni t ra operandi di t ipo diverso non
possono essere calcolat e diret t ament e
Dei due operandi, uno ha un t ipo pi ampio
(capient e) dellalt ro, ad es. il t ipo double
pu cont enere qualsiasi valore di t ipo float,
che pu cont enere un long, che pu
cont enere un int
I l valore del t ipo meno capient e pu essere
convert it o nellalt ro t ipo senza perdit a
(ma con event uale approssimazione, ad es.
se un long grande quale 1234567890 viene
convert it o in float divent a 1.234567e9)
9
Espressioni numeriche
Operandi di t ipo diverso
Quest a conversione si chiama pr omozi one e
viene effet t uat a aut omat icament e
sulloperando del t ipo meno capient e
La promozione crea una variabile t emporanea
del t ipo pi capient e cont enent e il valore
promosso (es. un 3 di t ipo int viene
convert it o in un 3.0 di t ipo double)
10
Espressioni numeriche
Operandi di t ipo diverso
La let t era d indica il t ipo double, i il t ipo int
X = A
d
+ B
d
* C
i
o
d
|
d

d
Promozione
11
Espressioni numeriche
Operandi di t ipo diverso
La promozione avviene solo nel moment o in
cui necessaria per proseguire il calcolo
I l calcolo t ra B e C non richiede alcuna
promozione, a differenza di quello t ra A ed o
X = A
d
+ B
i
* C
i
o
i
|
d

d
Promozione
12
Espressioni numeriche
Operandi di t ipo diverso
At t enzi one
Supponiamo gli int siano su 16 bit (max
32767) e i long su 32 bit (max 2 miliardi)
I l codice seguent e d risult at o sbagliat o
(overflow) nel prodot t o.
int a, b;
long c;
a = 30000;
b = 2;
c = a * b;
Perch?
13
Espressioni numeriche
Operandi di t ipo diverso
Rispost a:
perch la variabile int ermedia o di t ipo int
e un int su 16 bit non pu cont enere 60000
Per risolvere il problema si deve far in modo di
avere una variabile int ermedia di t ipo long:
definendo almeno una delle variabili di t ipo long
oppure richiedendo esplicit ament e la promozione a
long di almeno una delle variabili
La seconda soluzione migliore: non richiede
di cambiare il t ipo delle variabili ( il risult at o a
non essere rappresent abile, non gli operandi)
14
Conversione di t ipo - cast
Loperat ore di cast produce una variabile
t emporanea del t ipo indicat o cont enent e il
valore originale convert it o nel nuovo t ipo (si
not i che la variabile originaria rest a int at t a)
(tipo)espressione
Esempio
c = (long)a
Loperat ore di cast opera in modo simile alla
promozione, salvo che:
la conversione non aut omat ica, ma su richiest a
del programmat ore
il programmat ore indica il t ipo di dat o volut o per la
variabile t emporanea
15
Conversione di t ipo - cast
Ha priorit maggiore degli operat ori mat em.
La conversione di un valore da un t ipo meno
ampio ad uno pi ampio preserva il valore
La conversione di un valore da un t ipo pi
ampio a uno meno ampio pu eliminare bit
significat ivi possibile errore di conversione
Ad es. su una macchina con int a 16 bit :
long x = 12345678L;
int y = (int)x;
il cast d risult at o errat o in quant o produce
un valore fuori range per gli int (il max su
16 bit 32767)
16
Conversione di t ipo - cast
La conversione di un valore float ing-point in
un valore int ero avviene con t roncament o
della part e frazionaria, sempre che la part e
int era sia rappresent abile con quel t ipo
Soluzioni delloverflow in c=a*b :
c = (long)a * b; cast applicat o ad a
c = a * (long)b; cast applicat o a b
c = (long)a * (long)b;
c = (long)(a*b); I NUTI LE!
Nellult imo caso il cast viene applicat o al
risult at o delloperazione, ma loperazione
st essa a dare problemi, non lassegnazione a c
17
Promozioni int egrali
Nelle espressioni mat emat iche, i valori dei t ipi
char e short int, i campi di bit e gli
element i delle enum vengono
aut omat icament e convert it i:
in int se quest o t ipo pu rappresent are i valori
originali
in unsigned int alt riment i
18
Conversioni nelle assegnazioni
Quando un valore di un t ipo viene assegnat o
ad una variabile di un alt ro t ipo, vi una
implicit a conversione del valore al t ipo della
variabile da assegnare
Poich nella conversione di un valore da un
t ipo pi ampio ad uno meno ampio ci possono
essere i problemi indicat i precedent ement e, in
quest i casi i compilat ori at t uano comunque la
conversione, ma in pi alcuni (non t ut t i)
segnalano il problema con un war ni ng
Se lassegnazione comunque volut a si usi un
cast (anche per eliminare levent uale warning)
19
Conversioni nelle assegnazioni
Esempi
(supponendo long su 32 bit e int su 16 bit )
int a, b=12;
long l=123456789;
double e, f=3.0, g=9.275;
a = f; warning (a vale 3)
a = (int)f; No warning (a vale 3)
a = (int)g; No warning (a vale 9)
e = b; No warning (e vale 12.0)
a = l; warning (a vale ???)
a = (int)l; No warning (a vale ???)
20
Overflow e Underflow
La gest ione delloverflow, della divisione per 0
e delle alt re eccezioni (errori al run-t ime) nella
valut azione delle espressioni non definit a dal
linguaggio (undefined behavior ), ma dipende
dallimplement azione (ossia dal compilat ore: in
alcuni sist emi vengono ignorat i, in alt ri rilevat i)
I n genere loverflow prodot t o da:
int eri con segno: viene ignorat o
valori Float ing-Point : produce il valore speciale I NF
(infinit o)
divisione per 0: ferma il programma
21
Overflow e Underflow
Per i valori senza segno, in caso di overflow il
C89 non indica un comport ament o indefinit o,
ma richiede espressament e che si seguano le
leggi dellarit met ica modulo 2
n
:
es. su 8 bit : 255+ 1= 0
infat t i 11111111+ 1= 00000000
es. su 8 bit : 01= 255 )
Quando si sommano due numeri Float ing-
Point e il rapport o t ra i due < 2
23
(I EEE-
P754 SP) o < 2
52
(I EEE-P754 DP) si ha un
Underflow, ossia il minore viene t rascurat o
22
Operat ori + + e
I ncrement ano/ decrement ano di 1 una variabile:
++a;
++a increment a a di 1 prima che a venga
ut ilizzat a nel calcolo (increment o prefisso)
a++ increment a a di 1 dopo che a st at a
ut ilizzat a nel calcolo (increment o post fisso)
a e a decrement ano a di 1
Esempi:
a = 5;
x = ++a;
ora a vale 6 e x vale 6
a = 5;
x = a++;
ora a vale 6 e x vale 5
23
Operat ori + + e
Priorit maggiore degli operat ori mat emat ici
Ut ilizzabili solo con modi f i abl e L-val ue
(ossia un qualcosa che si pu met t ere a
sinist ra di un segno di assegnazione): ad es.
non si possono applicare al risult at o di un
calcolo
(a+1)++; ERRORE
At t enzione
Le variabili usat e con un operat ore + + o
non possono apparire pi di una volt a nella
st essa espressione (fino al ; finale)
x = i * i++; Errore
24
Operat ori di assegnament o
I n C lassegnazione unespressione e
dunque produce un risult at o: il valore
dellespressione a dest ra del segno =
Quest o e lavere associat ivit da dest ra a
sinist ra permet t e di assegnare lo st esso valore
a pi variabili con la scrit t ura seguent e:
a = b = c = 2;
che equivale a:
a = (b = (c = 2));
25
Operat ori di assegnament o
La forma di assegnament o:
variabile op= espressione
essendo op un operat ore del C, equivale a:
variabile = variabile op espressione
x += 5;
equivale a x = x + 5;
Esist e per t ut t i gli operat ori arit met ici e bit wise:
+= = *= /= %= &= ^= |= <<= >>=
Dopo aver vist o i vet t ori:
vett[y%(x+2)] += 5;
in quest o esempio evident e il vant aggio (di
digit azione e di comput azione) di non dover
scrivere due volt e la quant it da increment are
26
Funzioni mat emat iche
Sono cont enut e in una libreria est erna al
compilat ore, collegat a alleseguibile dal linker
Richiedono che venga indicat o il file di
int est azione (header f i l e) <math.h> che ne
descrive la sint assi
Elaborano valori double (indicat i t ra
parent esi) e producono risult at i double
Se i valori passat i non sono di t ipo double,
vengono aut omat icament e promossi a t ale
t ipo (per effet t o del prot ot ipo < math.h> )
Le funzioni t rigonomet riche usano i radiant i
(180
o
= t rad)
27
Funzioni mat emat iche
sin(x) seno
cos(x) coseno
tan(x) t angent e
asin(x) arcoseno
acos(x) arcocoseno
atan(x) arcot angent e
atan2(y,x) arcot angent e di y/ x,
maggiore precisione della
precedent e per x piccoli
exp(x) esponenziale e
x
log(x) logarit mo nat urale
log10(x) logarit mo in base 10
28
Funzioni mat emat iche
pow(x,y) x
y
(se y< 0, x deve avere
valore int ero)
sqrt(x) radice quadrat a (x > 0)
fabs(x) valore assolut o
ceil(x) minimo int ero > x
floor(x) massimo int ero s x
Esempi
y = sin(x*3.14/180);
y = sin(x*2)*2;
z = sqrt(fabs(x)*fabs(y));
z = log(x)/log(2);
Pi = 4.0*atan(1.0);
29
Funzioni mat emat iche
Alcune alt re funzioni mat emat iche sono
descrit t e nellheader file <stdlib.h>:
abs(x) calcola il valore assolut o di un
valore int e produce un risult at o
di t ipo int
labs(x) calcola il valore assolut o di un
valore long e produce un
risult at o di t ipo long
30
Funzioni mat emat iche
Per arrot ondare un numero allint ero pi
vicino la libreria st andard non dispone di
alcuna funzione
Una soluzione st at ist icament e corret t a
richiede che i valori x.5 siano approssimat i:
se x dispari: per eccesso (allint ero successivo)
se x pari: per difet t o (allint ero precedent e)
2.5 2
1.5 2
+ 1.5 + 2
+ 2.5 + 2
31
Funzioni mat emat iche
Una soluzione pi semplice (ma non
st at ist icament e corret t a) la seguent e:
Approssimazione sempre per eccesso
valori posit ivi:
(int)(valore+0.5)
valori negat ivi:
(int)(valore-0.5)
Approssimazione sempre per difet t o
valori posit ivi:
(int)(valore+(0.5-DBL_EPSILON))
valori negat ivi:
(int)(valore-(0.5-DBL_EPSILON))
32
Valori casuali
La funzione rand ogni volt a che viene
chiamat a produce un diverso valore int ero
compreso t ra 0 e RAND_MAX (est remi inclusi)
con dist ribuzione uniforme
x=rand();
RAND_MAX vale almeno 32767 (il valore
effet t ivo dipende dal compilat ore)
Le funzioni e le definizioni delle cost ant i
simboliche sono cont enut e in <stdlib.h>
Per rendere effet t ivament e casuali i valori
generat i, allinizio del programma si aggiunga
(una sola volt a) list ruzione:
srand(time(NULL));
(bisogna includere <time.h>)
33
Valori casuali
Per avere un valore int ero t ra 0 e N (escluso):
x = rand() % N;
I n alcuni sist emi il generat ore di numeri
pseudocasuali produce valori la cui part e
bassa ha dist ribuzione poco uniforme, per cui
pu essere preferibile la formula :
x = rand() / (RAND_MAX / N + 1);
Per un esempio di funzione casuale con
dist ribuzione gaussiana si veda la cit at a FAQ
di St eve Summit (13.20)
34
Esercizi
0 Disegnare il diagramma di valut azione della
seguent e espressione, considerando le variabili
definit e come segue:
float A,X;
int B,D;
long C;
X=(A+4E2*B) * (C / 2)/ atan(4.F * D);
.
35
Esercizi
0 Soluzione (nei cerchi il t ipo prodot t o)
X=(A+4E2*B) * (C / 2)/ atan(4.F * D);
D
D D
D D
D
D
D
L
L
F
F
F
F D I I L
F
I
D
at an( )
*
*
*
+
*
/
.
( )
pr omozi one
pr omozi one
pr om.
pr om.
pr om.
pr omozi one
conver si one
36
Esercizi
1. Scrivere un programma che chieda 4 numeri
int, ne calcoli la media, la memorizzi in una
variabile float e la visualizzi con 2 decimali.
2. Scrivere un programma che chieda un valore
double di t emperat ura in gradi Fahrenheit e
calcoli i valori delle corrispondent i
t emperat ure in gradi Celsius e Kelvin
(ent rambi con part e frazionaria).
15 . 273
) 32 (
9
5
+ =
=
C K
F C
37
Esercizi
3. Un ogget t o che si muove ad una velocit v
confront abile con quella della luce c
(2.9979310
8
m/ s) si accorcia (nel senso della
direzione) e aument a di massa. Le due
grandezze sono (appropriat ament e! )
modificat e da un fat t ore (minore di 1) pari a:
Si scriva un programma che chieda la
lunghezza e la massa di un ogget t o fermo e
calcoli la variazione delle due grandezze a
quella velocit (richiest a in input in km/ sec).
2
1
|
.
|

\
|
=
c
v

38
Esercizi
4. Si scriva un programma per calcolare la
dist anza in linea daria t ra due punt i della
superficie t errest re, not e le coordinat e
geografiche. I l programma chiede i valori di
lat it udine (N-S) e di longit udine (E-O) in gradi
dei due punt i. Per calcolare la dist anza si usi
la seguent e formula (le coordinat e Nord e Est
sono posit ive, Sud e Ovest negat ive). Si
ricordi che le funzioni t rigonomet riche
ut ilizzano i radiant i.
dist anza = arccos( p1+ p2+ p3 ) * r
39
Esercizi
(Cont inuazione)
dove:
r il raggio medio della Terra: 6372.795 km
p1 = cos(lat 1 )* cos(lon1 )* cos(lat 2 )* cos(lon2 )
p2 = cos(lat 1 )* sin(lon1 )* cos(lat 2 )* sin(lon2 )
p3 = sin(lat 1 )* sin(lat 2 )
essendo:
lat 1 lat it udine in gradi del primo punt o
lon1 longit udine in gradi del primo punt o
lat 2 lat it udine in gradi del secondo punt o
lon2 longit udine in gradi del secondo punt o
N.B. La formula considera la t erra sferica con
raggio medio r : non essendolo, la formula d
un risult at o con un errore massimo dello 0.5%.
40
Esercizi
(Cont inuazione)
Per la formula del arco-coseno non si ut ilizzi la
funzione di libreria acos, ma la seguent e:
Calcolare le dist anze t ra gli aeroport i di:
Torino (TRN, 45.02
o
N, 07.65
o
E)
Roma (FCO, 41.81
o
N, 12.25
o
E)
Los Angeles (LAX, 33.94
o
N, 118.40
o
W)
Not a: t = 4tan
-1
(1)
[ Rispost e: TRN-FCO: 515.20 km, TRN-LAX: 9692.7 km,
FCO-LAX: 10205.48 km]
2
1
arctan ) arccos(
2
t
+
|
|
.
|

\
|

=
x
x
x