atof completeaza zecimale

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

atof completeaza zecimale

Post by black_atus » 16 Oct 2013, 15:49

Buna ziua,

Intr-un program de C++ in care faceam atof dintr-un CString care practic era un numar cu vreo 13, 15 zecimale imi returna un double cu acelasi numar si inca vreo 2 zecimale in coada(01);
Incerc sa scap de ultimele zecimale si nu stiu ce metoda as putea folosi. Am o functie care imi extrage precizia din string dar nu ma prea ajuta...
Oricum mai sunt diferente dar cand compar fac ceva de genul daca fabs(nr1 - nr2) < 1E-10 dar nu stiu cum sa scap de zecimalele alea din double..

Multumesc anticipat!


Cu stima,
Daniel Constantin

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

Re: atof completeaza zecimale

Post by bu7ch3r » 16 Oct 2013, 16:50

Cum extragi precizia din string ?

Iti dau eu un hint:
0.002 - 0.00199 = 0.0001
200 - 199 = 1
Cu stima,
Lupu Claudiu

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: atof completeaza zecimale

Post by black_atus » 16 Oct 2013, 17:17

nu asta e problema ca o extrag din string...Problema e ca am un double cu mai multe zecimale si am nevoie sa scap de ce imi pune in plus atof... Stiu sa le si compar in functie de precizia extrasa din string dar am o functie care primeste double si afiseaza. Ma intereseaza sa trimez cumva acel double inainte sa ajunga la functie ...
Cu stima,
Daniel Constantin

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: atof completeaza zecimale

Post by Silviu Ardelean » 16 Oct 2013, 18:11

Din ce spui tu pana acum nu reiese daca folosesti aceea valoare double rezultata la altceva decat la pasarea spre functia ce-ti primeste double si iti face afisarea. Mai folosesti la ceva(ex. calcule) valoarea double obtinuta inainte de afisare?

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

Re: atof completeaza zecimale

Post by bu7ch3r » 16 Oct 2013, 20:52

Salut,

Silviu, cred ca black_atus e uimit ca 2.3 e defapt 2.3000012.
black_atus, s-a mai discutat aici despre "cum isi bate procesorul joc de floatii tai": viewtopic.php?f=13&t=2065&p=13323&hilit=zecimale#p13323

Ai o gramada de optiuni:
1. sa inveti cum e reprezentat un double in virgula mobila si sa faci 0 o bucata din mantisa...si nu stiu sigur daca asta rezolva problema ta.(ma gandeam la asta in timp ce-mi cumparam niste beri)
2. sa "lucrezi"(la un mileu) cu long long si sa faci long long = double(ul tau) * cate_zecimale_ai_tu_chef_sa_afisezi. Apoi sa faci diferenta dintre un long long si alt long long si apoi sa il inparti la cate_zecimale....
2.a. 2 poate sa-ti dea iar probleme din acelasi motiv mai sus mensionat atunci cand faci impartirea.
3. Clase speciale - trebuie sa fie clase speciale care fac operatii cu numere nebunatice ca ale tale
[text_taiat_pe_mijolc]4. Hardcore FPU operations?[text_taiat_pe_mijolc]
4.a da, este un siamez al CPU-ului care se ocupa de asta...FPU il cheama (sper :)) si ala se ocupa de operatii in virgula mobila.

Destainuire:
Eu am avut mari probleme cand am avut de impartit, la control, width-ul coloanelor in functie de procent.... Faceam ce faceam si imi ramaneau niste pixeli(1-2-3-6...10 nu:D) la sfarsitul header-ului.
But din fire am observart ca desi faceam o coloana 25px, ea facea cum facea si se facea 24 px ---(24,99999 defapt - dar ignoram zecimalele - umple tu 0.99999px dintr-un px:))
ceil, floor si alte functii "destepte" de aproximare nu m-au ajutat.
Atunci mi-a venit ideea geniala(penibil) sa nu ma mai bazez pe ce imi returneaza width/nr_col, pt ca ma facea la pixeli... si sa inmultesc cu 100 tot tot...
Si uite asa poti sa vezi un antivirus(aproape foarte tare) care are un tree header care imparte "la sange" in coloane.
Cu stima,
Lupu Claudiu

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: atof completeaza zecimale

Post by Silviu Ardelean » 16 Oct 2013, 21:44

bu7ch3r wrote:Silviu, cred ca black_atus e uimit ca 2.3 e defapt 2.3000012.
Se prea poate... :) Dar fiind enuntul incomplet, intrebarea mea era in ideea c-ar putea incerca sa faca aceea transformare la double doar pentru a-i folosi la pasarea functiei cu input de double pentru a afisa. Iar in acest caz i-as recomanda sa faca afisarea directa a stringului respectiv (cu riscul de a-si mai face o metoda/functie de afisare ce primeste string). Sincer, mi se pare ciudat sa tii un numar real in CString, dar na... pentru afisare, e musai.
bu7ch3r wrote:2. sa "lucrezi"(la un mileu) cu long long si sa faci long long = double(ul tau) * cate_zecimale_ai_tu_chef_sa_afisezi. Apoi sa faci diferenta dintre un long long si alt long long si apoi sa il inparti la cate_zecimale....
Asta cu mileul e din seria: Unde-i butonul de Like? :thumbup: Nu odata i-am simit lipsa!

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

Re: atof completeaza zecimale

Post by Ovidiu Cucu » 18 Oct 2013, 10:49

Daca vrei reprezentari cu zecimale exacte, atunci nu folosesti virgula mobila (float, double) ci virgula fixa.
Limbajul C/C++ nu are un asemenea tip (decimal, currency) insa, daca musa-i si-ai nevoie implementezi unul.
O solutie ar fi o clasa care sa-ti tina numerele pe stringuri (fiecare byte din string este o cifra), in care supraincarci operatorii in asa fel incat sa implementezi aritmetica in virgula fixa. Nu iese ceva foarte fast insa e OK pentru aplicatii contabile, sa zicem.
O alta solutie este sa tii partea intreaga si cea zecimala pe doi intregi. E mai fast insa ai limitari la numarul de cifre. Poate fi insa si asta o solutie pentru majoritatea aplicatiilor contabile.

Ceva de genul asta gasesti deja implementat in MFC. Click: COleCurrency Class

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: atof completeaza zecimale

Post by black_atus » 30 Oct 2013, 15:37

Luam numarul dintr-un fisier .txt si venea cu destul de multe zecimale. Am verificat calculele care trebuiau facute cu numarul asta la mine in aplicatie si l-am rotunjit pana la valoarea la care nu mai conteaza urmatoarele zecimale pentru a-mi afecta cumva rezultatele. Asa am ajuns pe la a 12'a zecimala :D.
Multumesc pentru ajutor. Mi s-a parut totusi interesant si e bine ca acum stiu ca atof mai face si completari cand sunt cazuri cu multe zecimale.
Prima solutie care imi venise in cap era cea a lui Ovidiu sa imi tin numerele in stringuri dar era putin prea complicata...
Cu stima,
Daniel Constantin

Post Reply