[ powersz @ 02.11.2014. 19:49 ] @
Pozdrav, imam problem sa prikazom vrednosti.
0.5 prikazuje kao 5e-1 dok 2.8 prikazuje kako treba.
Kako resiti ovaj problem?

Sledi primer koda:

Code:

double vrednost1=0.5;
double vrednost2=2.8;

char prikaz1[15];
char prikaz2[15];

FloatToStr(vrednost1, prikaz1);
FloatToStr(vrednost2, prikaz2);

//stampam na lcd
      Lcd_Out(1, 1,prikaz1);
      Lcd_Out(2, 5, prikaz2);

[ mikikg @ 03.11.2014. 14:34 ] @
Probaj ovako, dodaj "F" iza brojeva:

double vrednost1=0.5F;
double vrednost2=2.8F;

[ Odin D. @ 03.11.2014. 15:09 ] @
"Problem" je očigledno u funkciji FloatToStr().
Ako imaš source prepravi je, a ako nemaš možeš da napišeš svoju verziju, trivijalno je.
[ ZAS011 @ 03.11.2014. 19:45 ] @
Za MikroC funkcije nema source koda, kao ni za ostale Mikro kompajlere
[ powersz @ 03.11.2014. 20:35 ] @
Hvala na odgovorima.

@mikikg, probao sam ali prijavljuje gresku.

@Odin D. nisam uspeo da nadjem source. Zaista nemam ideju kako da napravim funkciju. Nasao sam nekoliko primera na internetu ali ni jedan ne radi.
Bio bih jako zahvalan da neko napise neki hint ili kod pa da probam.
......
na njihovom forumu pronasao sam sledeci kod ali ne radi kako treba..

Code:
unsigned long temp;

temp = (unsigned long)temp_res * 5 * 1000 / 1024;
 
txt[0] = temp / 1000 + '0';
txt[1] = '.';
txt[2] = (temp / 100) % 10 + '0';
txt[3] = (temp / 10) % 10 + '0';
txt[4] = temp % 10 + '0';
txt[5] = '\0';

Lcd_Out(2,1,txt);


[Ovu poruku je menjao powersz dana 03.11.2014. u 22:13 GMT+1]
[ Odin D. @ 03.11.2014. 22:34 ] @
A šta tačno ne radi kako treba? - broj na ekranu je netačan; ništa se ne prikazuje na ekranu; broj je tačan, ali nije u formi koja tebi odgovara...?
Ne možemo popravljati kod ako ne znamo šta je kvar.

Što se tiče da sam pišeš svoju verziju funkcije FloatToStr, imaš dva moguća puta:
1. rješavaš problem za opšti slučaj, pokrivaš sve moguće vrednosti varijable i svu moguću decimalne preciznosti u okviru platforme na kojoj radiš;
2. brojevi koje hoćeš da prikazuješ na ekranu su iz nekog užeg skupa, znaš max broj decimalnih mjesta prije i poslije decimalne tačke, i pišeš rješenje koje pokriva isključivo te potrebe.

S obzirom da se radi o mikrokontroleru, 2. slučaj je obično smisleniji, jer štediš procesorsko vreme i memoriju.
Znači, daj neke konkretne specifikacije, pa da sklepamo neku funkciju.
[ powersz @ 03.11.2014. 22:52 ] @
Ispisuje tacan broj ali nije u formi koja mi odgovara.
Na primer broj 0.5 ispisuje kao 5e-1
sve brojeve vece od 1 ispisuje kako treba


upravo sam probao funkciju
Code:

sprintf(zaprikaz, "%f.2",broj);

i dobio sam poruku da nema dovoljno rom memorije.
meni je potrebno da double broj koji moze da bude 0.1 0.2 0.3 0.4 itd(povecava se za 0.1) da se tako i prikaze kada pretvorim u string.
Radi se o sekundama koje teoretski mogu da budu od 0.1 do 999.9

[Ovu poruku je menjao powersz dana 04.11.2014. u 01:12 GMT+1]
[ Odin D. @ 04.11.2014. 14:03 ] @
Probaj ovu funkciju:

Code:
void FloatToString2(float mynumber, char cifra[]) {

    int i;

    // pretvaranje broja u znakove
    cifra[0] = (long)mynumber / 100 + '0';
    cifra[1] = ((long)mynumber / 10) % 10 + '0';
    cifra[2] = (long)mynumber % 10 + '0';
    cifra[3] = '.';
    cifra[4] = ((long)(mynumber * 10)) % 10 + '0';
    cifra[5] = '\0';

    // ukloni vodece nule ako ih ima
    while ((cifra[0] == '0') && (cifra[1] != '.')) {
        for (i = 0; i < 5 ; i++)
            cifra[i] = cifra[i+1];
    }

    return;
}


Ovo bi trebalo da ti formatira broj onako kako ti hoćeš.
Međutim, moguće je da ćeš povremeno imati problem sa decimalom.
U zavisnosti od interne reprezentacije brojeva u tvom CPU-u, zbog konačne tačnosti,
on ne može da prikaže sve moguće brojeve, već samo one koji mu se poklapaju sa
njegovim minimalnim inkrementom.
Npr. broj 123.7 može biti zapisan kao 123.699997, jer je to najpribližnije što se može postići u
tipu float sa preciznošću od 6 decimala.
Ova funkcija će ti od toga napraviti 123.6 umjesto 123.7.
No, to sve zavisi odakle dobijaš te svoje brojeve i kako radi float i zaokruživanje na tvojoj platformi,
što znači da možda u tvom slučaju i nećeš imati problema.
Ali eto, ako budeš imao slične probleme da znaš od čega je, pa da onda možeš da popravljaš (zaokruživanjem).
[ powersz @ 04.11.2014. 23:49 ] @
Ova funkcija radi bas ono sto treba. Hvala puno na pomoci :)