Pages: 1 [2] 3   Go Down
Author Topic: "estrarre" il punto decimale da un float, come fare?  (Read 3375 times)
0 Members and 1 Guest are viewing this topic.
Genova
Offline Offline
Faraday Member
**
Karma: 35
Posts: 3151
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

copiaFloat = numeroFloat;
int a = copiaFloat;

come fa a copiare su una variabile dichiarata int un float? dovrebbe trasformare in intero prima la variab float no?

copiaFloat %= 10;       %= questo è un operatore binario mescolato a int e float ... qualcosa non va smiley
« Last Edit: October 11, 2012, 05:26:30 am by pablos » Logged

I microcontrollori sono come le donne ... non finirai mai di conoscerli!

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10420
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
come fa a copiare su una variabile dichiarata int un float? dovrebbe trasformare in intero prima la variab float no?
l'autocast si occupa di tutto. al massimo deve forzarlo facendo

int a = (int)numeroFloat;

Quote
%= questo è un operatore binario

assolutamente no! questo è un operatore MATEMATICO, che vuol dire "il resto della divisione".
che però ora che ci penso non è stato implementato per i float...

quindi devi includere la math.h

copiaFloat = fmod(copiaFloat , 10);

se prima è servito castare a forza in int, servirebbe anche quì:

copiaFloat = (float)fmod(copiaFloat , 10);

se non fosse che float e doube son la stessa cosa

da http://www.arduino.cc/en/Reference/MathHeader
« Last Edit: October 11, 2012, 05:36:58 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Genova
Offline Offline
Faraday Member
**
Karma: 35
Posts: 3151
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

copiaFloat %= 10;

sarà come dici tu

sketch_oct11b:8: error: invalid operands of types 'float' and 'int' to binary 'operator%'
sketch_oct11b:8: error: in evaluation of 'operator%=(float, int)'
Logged

I microcontrollori sono come le donne ... non finirai mai di conoscerli!

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

copiaFloat %= 10;

L'operatore modulo, %, si può usare solo con i numeri interi, non è ammesso l'uso con i float.

Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10420
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

copiaFloat %= 10;

sarà come dici tu

sketch_oct11b:8: error: invalid operands of types 'float' and 'int' to binary 'operator%'
sketch_oct11b:8: error: in evaluation of 'operator%=(float, int)'


Quote
L'operatore modulo, %, si può usare solo con i numeri interi, non è ammesso l'uso con i float.

ma il mio ultimo post conteneva già la soluzione (magari vi siete persi l'edit, 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

Quote
che però ora che ci penso non è stato implementato per i float...

quindi devi includere la math.h

copiaFloat = fmod(copiaFloat , 10);

se prima è servito castare a forza in int, servirebbe anche quì:

copiaFloat = (float)fmod(copiaFloat , 10);

se non fosse che float e doube son la stessa cosa

da http://www.arduino.cc/en/Reference/MathHeader
« Last Edit: October 11, 2012, 06:39:38 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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.
Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10420
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!!!!!!!!!!!!   smiley-twist

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

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:
« Last Edit: October 11, 2012, 07:04:54 am by gingardu » Logged


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

Genova
Offline Offline
Faraday Member
**
Karma: 35
Posts: 3151
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol
Logged

I microcontrollori sono come le donne ... non finirai mai di conoscerli!

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

In conclusione se provaste ciò che suggerite in 2 post sarebbe chiuso il caso  smiley-lol

+1  smiley
Sagge parole, prima di postare del codice tocca sempre provarlo, o almeno avvisare che non è testato, altrimenti si fa solo perdere tempo alla gente.
Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10420
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol

se no fossi al lavoro.... io ho dato la logica e gli strumenti, che ce lo mettano loro il compilatore. xD


@gingardu: credo che il problema con cui ti scontri è il fatto che i float, per come vengono memorizzati, possiedono un errore. Non puoi farci niente, se vuoi usare i float. per maggiori info: http://it.wikipedia.org/wiki/IEEE_754

Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sto provando questo sketc  a volte funziona a volte no
e piu precisamente sembra che ha la tendenza ad arrotondare la cifra immessa

Ed ecco il classico caso di chi fa le domande e non legge tutte le risposte, ti ho avvisato molti post dietro che i float sono una rappresentazione esponenziale e che ti puoi scordare dei valori precisi, sono sempre leggermente diversi dal reale valore, calcolato con molta più risoluzione, per via degli arrotondamenti durante i calcoli e il particolare formato di rappresentazione.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 35
Posts: 3151
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa gingardu però è difficile capire cosa vuoi fare, nel primo post chiedi di sapere in che posizione numerica si trova la virgola, quindi di conoscere i valori prima della virgola e dopo non ti interessa come scrivi qui:

Quote
cifra1=0  //  non ha il punto decimale
cifra2=0 //  non ha il punto decimale
cifra3=1 //  HA il punto decimale
cifra4=0  //  non ha il punto decimale
cifra5=0  //  non ha il punto decimale
cifra6=0  //  non ha il punto decimale 

quindi qualcuno non approva a convertire il valore in string, però se ti serve sapere la posizione perchè non farlo?

Se poi tu dicessi in sintesi perchè vuoi questo valore, da dove arriva questo numero float, cosa devi fare una volta trovato questo valore ti si può suggerire un altra soluzione, ti ho chiesto in un post precedente che hai ignorato perchè questa insolita domanda sulla posizione della virgola.... te lo faccio io lo sketch dimmi cosa vuoi fare smiley

ciao

Logged

I microcontrollori sono come le donne ... non finirai mai di conoscerli!

Genova
Offline Offline
Faraday Member
**
Karma: 35
Posts: 3151
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se è solo la posizione che ti serve
Code:
String stringa = "6546456456457.56720";
byte x; byte c; byte par;
char charBuf[30];

void setup()
{
  Serial.begin(9600);
 
  stringa.toCharArray(charBuf, 40);  
  char *p = charBuf;  
  while (*p != '\0')
  {
    c++;
    if (*p == '.') { par=c; ++p; continue;}          
    ++p;
  }  
 
 //----------------------------------debug-----------------------------------------------
   Serial.println("stringa esaminata " + stringa);
   Serial.println("il punto si trova alla posizione " + (String)(par) + " da sinistra");
   Serial.println("il punto si trova alla posizione " + (String)(c-par+1) + " da destra");  
   Serial.println("totale dei caratteri  " + (String)c);    
}

void loop(){}
« Last Edit: October 11, 2012, 07:58:26 am by pablos » Logged

I microcontrollori sono come le donne ... non finirai mai di conoscerli!

Pages: 1 [2] 3   Go Up
Jump to: