Conti con i float!

Ciao a tutti, questo è il mio primo post!! :)

Vi scrivo perchè ieri sera sperimentando un pò mi sono imbattuto in una cosa strana (o almeno per me è strana!)...

Molto semplicemente ho fatto fare dei conti all'Arduino con i float ed ho poi fatto stampare il risultato sullo schermo del pc tramite la seriale utilizzando il monitor dell'ambiente di sviluppo.

Sembra come se i numeri stampati avessero una risoluzione di solo due cifre dopo la virgola, ecco quindi che ad esempio 0.0050 viene stampato come 0.00!

Ho quindi fatto un test con questa moltiplicazione: 0.0048*0.0021=0.00001008 naturalmente il risultato stampato è 0.00...ma se ora moltiplico il risultato in questo modo: 0.00001008*1000000 mi viene stampato 10.08! Come se internamente i conti sono fatti con un ampia precisione ma a lmomento della stampa su seriale solo due cifre dopo la virgola vengono "viste"...com'è questa storia?? :o

E' solo una limitazione della seriale? Vi ringrazio per le risposte che vorrete darmi!

Up....nessuno che sappia confermare o smentire quello che ho scritto?? :'(

Grazie!! :)

oltre che con la seriale, capita anche con gli LCD...ma non so il motivo. La supposizione che mi sono fatto è che sia un problema di "formattazione" del dato quando viene stampato. Interessa anche a me ;)

Si infatti...va bhè che alla fine conta che i conti (scusa il gioco di parole...!!) siano fatti bene, solo che se no volesse stampare dati con una pecisione maggiore è fregato...

Come si potrebbe risolvere??? Qualche anima buona ci aiuti!! :D

io se invio un float in seriale lo vedo interamente con tutti i suoi numeri decimali ...

Oddio....vuoi dire che io e Federico siamo gli sfigati di turno??? :o Potrebbe dipendere (dirò sicuramente una cavolata...) dall'ambiente di sviluppo o da qualche driver installato male? Ma se a federico non va manco con gli LCD....

meglio se postate il codice, o almeno la parte di codice con cui inviate alla seriale, usate sprintf() ?

Chiedo scusa per la risposta tardiva...purtroppo sono al lavoro...provo comunque ad andare un pò a memoria, il codice dovrebbe essere questo:

float n1;
float n2;
float ris;

void Setup(){

  Serial.begin(9600);

}

void loop(){

  n1 = 0.0048;
  n2 = 0.0021;
  ris = 0.00001008;
  ris = ris*1000000;
  
  Serial.println(ris);

  while(true){}

}

Ho inserito quel while per evitare di fargli stampare ogni volta che esegue il loop.... Se qualcuno può mi faccia sapere!!! Grazie!! ;D

Non riete gli unici.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1251872408

Aiuto non ce sto a capì più niente..... :P :P :P

Preso dal forum internazionale:

A simple solution is sprintf(ascii,"The Value is: %0d.%d", (int)temp, abs(temp1));

but test it out on a range of positive and negative values before posting more widely.

Something like the following may be a better solution because it avoids sprintf (uses much less ram and no problem with buffer overflows.). These could be enhanced by including a 'precision' parameter to set the number of digits after the decimal point.

void serialPrintFloat( float f){ Serial.print((int)f); Serial.print("."); int temp = (f - (int)f) * 100; Serial.println( abs(temp) );

}

void LCDPrintFloat( float f){ lcd.printIn((int)f); lcd.printIn("."); int temp = (f - (int)f) * 100; lcd.printIn( abs(temp) );

Grazie mille tinman66…appena posso provo poi vi faccio sapere…grazie ancora!!! :slight_smile: :slight_smile: