Go Down

Topic: "estrarre" il punto decimale da un float, come fare? (Read 4 times) previous topic - next topic

astrobeed


mi son ricordato dopo che arduino IDE ha questa mancanza) su gcc, e tutti i linguaggi che possiedono nativamente l'operatore modulo non ho mai trovato questo comportamento


Il compilatore di Arduino è il GCC, non c'entra nulla con l'IDE e le librerie di Arduino, l'operatore % è gestito dal GCC e l'errore lo da proprio il GCC, non mi obbligare a fare copia e incolla di pagine e pagine di manuali C dove si dice chiaramente che l'operatore % è esclusivamente per gli INTERI.
Se non ci credi guarda che errore mi da il C30 di Microchip, che si basa sul GCC, per una operazione % con i float:

Code: [Select]

// pezzo di codice incriminato
float pippo;
int pluto;

int main (void)
{
pluto = pippo%10;

//errore del compilatore
src\main.c: In function 'main':
src\main.c:132: error: invalid operands to binary %
Halting build on first failure as requested.

lesto

ok, ero convinto che il c ansi lo supportasse anche per float e double.

Comunque per tagliare la testa al toro il gioco del contare i numeri dopo la virgola si può fare anche senza usare il modulo usando una moltiplicazione per 10 finchè il numero moltiplicato (e diviso per 10^numero cifre contate) non è uguale alla forzatura del numero int
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

gingardu

#22
Oct 11, 2012, 01:59 pm Last Edit: Oct 11, 2012, 02:04 pm by gingardu Reason: 1
sto provando questo sketc  a volte funziona a volte no
e piu precisamente sembra che ha la tendenza ad arrotondare la cifra immessa

MA CHI GLIELO HA ORDINATO IL MEDICO!!!!!!!!!!!!!   ]:D

ES:  il valore  577.777  allinizio la prende (secondo il serial print 577.78)
e poi diventa  577.77696   =(

esempio se metto
valore_reale = 444.444;

tutto fila liscio  il serial print  da punto sulla 4 cifra (partendo da destra) e valore da inviare 444444 corretto,

l'idea di questo sketct è quello di prendere il numero
come int e  float
sottrare float da int se da diverso da zero moltiplico per 10  e un contatore che e a 1 aumeta di un unita (posizione punto decimale)

se c'è un sistema per non fare arrotondare il float siamo sulla buona strada

unsigned long mela;

  float  pesca;
  float valore_reale;
   byte  posizione_punto_sulla_cifra =1;
  float  k=0;
   unsigned long p;


void setup() {
 Serial.begin(9600);

 valore_reale = 444.444;  //cifre massime 7
  //if (valore_reale > 1 && valore_reale <10) valore_reale = valore_reale * 1000000;

 pesca = valore_reale;  //cifre massime 7

}

void loop()
{
 mela= pesca;

 if (pesca-mela>0)  posizione_punto_sulla_cifra  =  posizione_punto_sulla_cifra + 1, pesca = pesca*10;

 Serial.print("posizione_punto_sulla_cifra  ");
 Serial.println(posizione_punto_sulla_cifra);

 Serial.print("valore_reale  ");
 

 Serial.println(valore_reale, (posizione_punto_sulla_cifra-1) );

 if(posizione_punto_sulla_cifra == 1) p= 1;
 if(posizione_punto_sulla_cifra == 2) p= 10;
 if(posizione_punto_sulla_cifra == 3) p= 100;
 if(posizione_punto_sulla_cifra == 4) p= 1000;
 if(posizione_punto_sulla_cifra == 5) p= 10000;  
 if(posizione_punto_sulla_cifra == 6) p= 100000;
 if(posizione_punto_sulla_cifra == 7) p= 1000000;
 
   //if (valore_reale > 999999) posizione_punto_sulla_cifra =posizione_punto_sulla_cifra-1;
 //if (valore_reale > 999999) valore_reale =valore_reale/10;
 Serial.print("valore da mandare al display  ");
 Serial.println(valore_reale*p,0 );


}


Code: [Select]
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

pablos

Io non sono un genio in programmazione devo spesso documentarmi per fare cose un po' più complesse, e molte volte non mi escono come vorrei, però quando posto un pezzetto di sketch è assicurato al 100% che l'ho provato prima sul mio arduino. Diversamente farei perdere tempo a chi già sta diventando scemo per capire come fare.
In conclusione se provaste ciò che suggerite in 2 post sarebbe chiuso il caso  XD
no comment

astrobeed


ok, ero convinto che il c ansi lo supportasse anche per float e double.


Vale anche per il C++ perché % è un operatore vero e proprio del C, cioè fa parte del linguaggio, per i float si usa fmod() che è una funzione di libreria.

Go Up