mikroC e floating point

  • FPGA
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
13 Anni 4 Mesi fa - 13 Anni 4 Mesi fa #1 da FPGA
mikroC e floating point è stato creato da FPGA
Ciao Marco,
sono qua a chiederti cortesemente se mi sai dare una spiegazione a questo problema.
uso da qualche mese mikroC e dopo aver provato alcune difficolta poi risolte usando piu' attenzione, ora mi ritrovo proprio a non capirne una.
vorrei fare un operazione di timer per calcolare da overflow inc variabile e tick il tempo che dura un impulso .
avendo scritto qualche cosa che mi da dei tempi e caratteri che non mi tornano, ne ho fatto uno semplice per vedere come mikroC gestisce i numeri con la virgola .
Il programma è qua sotto:
Code:
float numero; char numero_txt[16]; // void main() { TRISD = 0; PORTD = 0; Lcd_Config(&PORTD, 2, 3, 1, 7, 6, 5, 4); //FREEDOM II CMCON = 7; // Disabilito i comparatori. // * numero che vorrei vedere, ma anche altri tipo 0.00006432 esempio. // ma io ho messo questo. numero = 0.0024; FloatToStr(numero,numero_txt); numero_txt[12]= 0; Lcd_Out(1,1,numero_txt); // display lcd valore : 2.399999e-3 // perche ? }
In mikrobasic potevo fare operazioni tipo 0,000064 * 256 + 1000 tipo!
e il display mi mostrava correttamente qualsiasi operazione io facevo.
Ma in C o meglio mikroC come potrei fare? conosci qualche metodo.
il problema pero sussiste solo se come numero intero non c'è alcun valore:
es.: 0.0024 mi da display lcd valore : 2.399999e-3
se scrivo però :1.0024 il display mi scrive correttamente 1.0024.
Come mai ? come posso trovare un sistema che mi faccia lo splash video anche di 100mS
anziche farmi scrivere : 1e-1 ?
Grazie mille, spero di essermi fatto capire credo?
Ciao Fabio
Ultima Modifica 13 Anni 4 Mesi fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
13 Anni 4 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: mikroC e floating poit
Ciao,

non sono certo di aver compreso il problema.

Nel caso pero' non volessi 2.399999e-3 ma 0.0024 potresti fare un controllo della stringa prima di scriverla.
Se e' presente una e la togli insieme alla potenza e sposti la virgola di conseguenza ed inserendo gli zeri se necessario.
In C e' anche presente la la funzione printf che ti permette di formattare la stringa con gli zeri che vuoi.
Ammetto pero' di non ricordare la sintassi per farlo. In ogni modo potrebbe anche non essere supportata dal compilatore.
L'elaborazione manuale che ho suggerito all'inizio funzionerebbe in ogni caso ma e' piu' elaborata.

Saluti,

Mauro
I seguenti utenti hanno detto grazie : FPGA

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • inx83
  • Nuovo Utente
  • Nuovo Utente
Di più
13 Anni 2 Giorni fa #3 da inx83
Risposta da inx83 al topic Re: mikroC e floating point
Ciao, e benvenuto nel maledetto mondo di microC. Anche io hosvuto lo stesso problema. Non e che il mikcoc non gestisce bene i numeri con la virgola ma e la funzione che trasforma il float in una stringa il problema. Io ho risulto facendo diventare il numero intero e poi ho fatto una funzione che decidi tu dove inserire il punto all'interno dell array. Prendi il numero e lo moltiplichi fino a farlo diventare intero. La funzione printf e accessibile solo se usi micro dells serie 18 perche richiede una notevole potenza di calcolo. Per ovviare a questo problema io mi sono scrittomuna funzione che passi un intero e decidi quante cifre mostrare e dovr mettere il punto.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Ifrit_Prog
  • Premium Utente
  • Premium Utente
Di più
13 Anni 2 Giorni fa - 13 Anni 2 Giorni fa #4 da Ifrit_Prog
Risposta da Ifrit_Prog al topic Re: mikroC e floating point
edit2:
Allora, leggendo la documentazione: www.mikroe.com/eng/downloads/get/1608/
una possibile soluzione potrebbe essere la seguente:
Code:
typedef unsigned char uchar; void MyFloatToStr(float fnum, uchar *str) { uchar* temp[10]; int cnt = 0; for (; abs(fnum) > 0; cnt++) { fnum *=10; temp[cnt]=0; } temp[cnt]='\0'; FloatToStr(fnum, str); str = strcat(temp,str); }

Poso elegante in questioni di memoria... e forse anche il metodo in cui si raggiunge la soluzione... cmq prova =)

edit3:
Ok sto rincoglionito oggi... la funzione cosi presentata non prevedel'inserimento del punto in caso sia un valore col problema... ecco il fix (sperando che non mi e' sfuggito altro -.-)
Code:
typedef unsigned char uchar; void MyFloatToStr(float fnum, uchar *str) { uchar* temp[10]; int cnt = 0; for (; abs(fnum) > 0; cnt++) { fnum *=10; temp[cnt]=0; } if ( cnt ) { temp[1]='.'; temp[cnt]=0; cnt++; } temp[cnt]='\0'; FloatToStr(fnum, str); str = strcat(temp,str); }
Ultima Modifica 13 Anni 2 Giorni fa da Ifrit_Prog.

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiStefA

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi