numere reale

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
mircea2011
Junior
Junior
Posts: 27
Joined: 11 Aug 2011, 23:12
Judet: Olt

numere reale

Post by mircea2011 » 12 Feb 2012, 18:22

salut.
am o problema aparent banala, dar n-am reusit sa fac nimic, si anume sa se determine numarul de cifre zecimale ale unui numar real.
ex : 24,6748
raspuns : numarul 24,6748 are 4 cifre zecimale.
multumesc.



User avatar
mihk
Junior
Junior
Posts: 39
Joined: 03 Jul 2009, 14:51

Re: numere reale

Post by mihk » 12 Feb 2012, 20:57

Code: Select all

int count_prec(double nr)
{
	int dig = 0;
	if(nr<0) nr*=-1;
	while(nr - (int)nr > 1e-6 && dig++<16)
		nr*=10;
	return dig;
}
Un exemplu nefericit asa de inceput.
Caut profesor.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: numere reale

Post by bu7ch3r » 13 Feb 2012, 00:35

Asta-i capcana sigur :))
In lumea procesoarelor 24.4567 n-are mereu 4 zecimale ;)
Image
Cu stima,
Lupu Claudiu

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: numere reale

Post by cristianamarie » 13 Feb 2012, 11:04

cast la long sa obtii intregul, il scazi din real, si obtii zecimalele
si testezi cu 0 ce ramine; != 0, inmultesti cu 10, scazi intregul la fel etc
atentie la erorile de cast

Code: Select all

double dbl = 24.6748;
long i_dbl = (long)dbl;
dbl -= i_dbl; // 0.6748
int decs = 0;
for(; dbl != 0; decs++) {  
  dbl *= 10;          // dbl  : 6.478 4.78 7.8 8
  dbl -= (long)dbl;   // i_dbl: 0.478 0.78 0.8 0
                      // decs : 1     2    3   4
}
sau cam asa ceva
Nuclear launch detected

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: numere reale

Post by mesajflaviu » 13 Feb 2012, 18:50

O alta metoda simpla de a gasi cate zecimale are o variabila long este de a o formata intr-un string si de acolo e simplu :

Code: Select all

	double dbl = 24.6748;
	CString sTemp;
	sTemp.Format(_T("%f"),dbl);

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: numere reale

Post by Ovidiu Cucu » 15 Feb 2012, 12:14

Dar daca luam un numar mai "serios", sa zicem
PI = 3,14159265358979323846264338327950288419716939937510...
Cate zecimale are? Infinit, cum ar zice profu de mate?
Nu. Depinde de reprezentare: daca e intr-un float va putea fi reprezentat cu un numar de zecimale, daca e intr-un double, altul.
Daca il tin intr-un format mai precis, sa zicem CURRENCY sau pe stringuri, iarasi obtin altceva.

Practic, in tehnica de calcul nu intereseaza cate zecimale are un numar dat (scris daca se poate cu creionul pe hartie) ci precizia cu care poate fi reprezentat in calculator.
Problema din acest topic face parte din seria "criza de inspiratie" pentru profii de info si autorii de quiz-uri.

@mesajflaviu:
Ar merge si metoda ta (nu neaparat cu MFC ci si cu functii CRT, sprintf s.a.m.d.).
Insa trecand peste faptul ca poti in anumite cazuri obtine erori de de reprezentare (vezi postul lui bu7ch3r) si peste ce am spus mai sus, daca avem de exemplu...

Code: Select all

   double PI = 2 * asin(1);
   CString strPI;
   strPI.Format(_T("%f"), PI);
   strPI.TrimRight(_T('0'));
   int nDecimals = strPI.GetLength() - strPI.Find('.') - 1;
...n-ar sari in sus numai profu de mate ci si un programator mai carcotas, care ar putea sa puna precizia la specificatorul de format (de exemplu, "%.9f" in loc de "%f") si sa-i dea un rezultat diferit. ;)
// 9 e mai aproape de "infinit" decat 6, nu-i asa? :biggrin:

Post Reply