Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
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