17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

Create successful ePaper yourself

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

ora zero pe baza a trei <strong>în</strong>tregi ce reprezintã ora, minutul si secunda. Acest numãr poate<br />

depãsi cel mai mare <strong>în</strong>treg reprezentabil pe 16 biti (short sau int <strong>în</strong> unele<br />

implementãri). Exemplu:<br />

#include <br />

int main () {<br />

int h1,m1,s1, h2,m2,s2, h,m,s; // h=ore,m=minute,s=secunde<br />

long t1,t2,t; int r;<br />

printf("timp1="); scanf("%d%d%d",&h1,&m1,&s1);<br />

printf("timp2="); scanf("%d%d%d",&h2,&m2,&s2);<br />

t1= 3600L*h1 + 60*m1 + s1; // poate depasi daca t1 int<br />

t2= 3600L*h2 + 60*m2 + s2; // poate depasi daca t2 int<br />

t=t1-t2;<br />

h= t/3600; r=t%3600; // h=ore<br />

m=r/60; s=r%60; // m=minute, s=secunde<br />

printf ("%02d:%02d:%02d \n",h, m, s);<br />

}<br />

Nu existã nici o metodã generalã de a detecta depãsirile la operatii cu <strong>în</strong>tregi pe un<br />

numãr mare de calcule, dar <strong>în</strong> cazuri simple putem sã verificãm rezultatul unei operatii<br />

unde suspectãm o depãsire. Exemplu:<br />

int main (){<br />

int a,b,c;<br />

scanf ("%d%d",&a,&b);<br />

c=a*b;<br />

if ( c/a != b)<br />

printf ("depasire !\n");<br />

else<br />

printf ("%d \n",c);<br />

}<br />

O alternativã este prevenirea aceste depãsiri. Exemplu:<br />

if (INT_MAX /a < b) // INT_MAX definit in <br />

printf ("depasire ! \n");<br />

else<br />

printf ("%d \n", a*b);<br />

- Erori la adunarea sau scãderea a douã numere reale cu valori foarte diferite prin<br />

aducerea lor la acelasi exponent <strong>în</strong>ainte de operatie. Se poate pierde din precizia<br />

numãrului mai mic sau chiar ca acesta sã fie asimilat cu zero.<br />

- Erori de rotunjire a numerelor reale datoritã numãrului limitat de cifre pentru<br />

mantisã. Mãrimea acestor erori depinde de tipul numerelor (float sau double sau long<br />

double), de tipul, numãrul si ordinea operatiilor aritmetice.<br />

Pierderea de precizie este mai mare la împãrtire si de aceea se recomandã ca aceste<br />

operatii sã se efectueze cât mai târziu <strong>în</strong>tr-o secventã de operatii. Deci expresia:<br />

(a*b)/c este preferabilã expresiei (a/c)*b

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

Saved successfully!

Ooh no, something went wrong!