infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Darius-Florentin Neatu din Aprilie 13, 2013, 20:04:05



Titlul: problema numere reale
Scris de: Darius-Florentin Neatu din Aprilie 13, 2013, 20:04:05
Salut. Sunt incepator in C++. Nu stiu de ce in codul urmator timp este trunchiat la partea intreaga.

long double timp;
timp=d*3600/vi;  //d,vi sunt int-uri


Titlul: Răspuns: problema numere reale
Scris de: Paul-Dan Baltescu din Aprilie 13, 2013, 20:16:21
Compilatorul presupune ca tipul final al unei operatii este dat de cel mai mare dintre tipurile elementelor care participa in operatie. In cazul tau, operatiile se executa in ordinea urmatoare (dupa cum si e normal): inmultire, impartire, atribuire. De aceea, cand este calculat rezultatul impartirii dintre d*3600 si vi, tipul considerat este int (operanzii fiind amandoi de tip int), iar abia la pasul urmator rezultatul este convertit la long double pentru ca timp (care abia acum participa la evaluare) este de tip long double. Rezultatul impartirii a doua elemente de tip intreg este partea intreaga (sau catul) corespunzator fractiei.

Niste idei despre cum poti rezolva problema:
Cod:
long double timp = (long double) d * 3600 / vi;
(convertesti d la long double si atunci toate operatiile se executa pe long double) sau

Cod:
long double timp = d * 3600.0 / vi;
(il folosesti pe fratiorul de tip double al lui 3600 si atunci toate calculele se executa pe double pana la atribuire cand rezultatul devine long double)

Dupa cum vezi, a doua varianta nu face exact ce vrei, dar e mai concisa si de multe ori suficienta.


Titlul: Răspuns: problema numere reale
Scris de: Darius-Florentin Neatu din Aprilie 13, 2013, 23:18:33
multumesc