"estrarre" il punto decimale da un float, come fare?

volevo qualche spunto per estrarre la virgola da un numero float, faccio un esempio pratico come servirebbe

parto già da una variabile (numero) che potrebbe essere 8274,51 devo trovare un sistema che mi segnali il punto decimale sulla cifra

esempio 8274,51

partendo dalla cifra meno significativa 1

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

Non riesco a comprendere la tua domanda, un float non ha il punto decimale, è una rappresentazione in formato mantissa e esponente del valore. Quando utilizzi un float il software sa già come trattare tale valore, quindi non è un problema dove si trova la virgola, se invece lo devi trasformare in formato stringa ci sono apposite funzioni per farlo, idem se devi spezzarlo nella parte intera e decimale, in formato numerico, in due diverse variabili.

Provo a riformulare Ho un valore numerico (potrebbe essere qualsiasi valore) da 0 a 10 cifre In caso questo valore non sia un numero intero ma ha anche i decimali, mi deve “mandare qualcosa” a 1 “qualcosa” deve specificare l’esatta cifra in cui si trova la virgola o il punto decimale, esempio 1234567,89 mi deve restituire cifra 3 =1 // contando le cifre da destra il 7 è la terza cifra ed e quella che ha il punto decimale,

perche poi devo riprenderla con un if if (cifra 3= =1) digitalWrite (6, HIGH); // che va ad accendere il punto decimale su display led se il numero e 12,3456789 mi deve restituire cifra 8 =1 // contando le cifre da destra il 2 è l’ottava cifra ed e quella che ha il punto decimale, se serve le cifre le dichiariamo prima tutte a zero e solo quella che vicino il punto decimale va a 1 cifra 1 cifra 3 …….. ……… cifra 9

ma scusa tu vuoi usare questa cifra dove ogni numero corrisponde ad una porta? la virgola non sarebbe altro che un separatore? vuoi raccogliere in un unica cifra i comando high e low? Spiega meglio cosa vuoi fare.

Trasformi il numero in una stringa e con la funzione apposita cerchi la posizione del carattere virgola.

PaoloP: Trasformi il numero in una stringa e con la funzione apposita cerchi la posizione del carattere virgola.

e precisamente come si fa ?

Un float su Arduino non ha cosí tante cifre come Tu presupponi. http://arduino.cc/en/Reference/Float Ciao Uwe

gingardu: Provo a riformulare

Come prima cosa scordati le 10 cifre con i float, al massimo ottieni 7-8 cifre complessive, tra parte intera e decimale, a seconda del segno e del valore, inoltre scordati i valori esatti perché per via della natura dei float i calcoli risultano sempre con il massimo numero possibile di cifre decimali anche se devono dare un valore intero.

ripensandoci potresti fare così

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(2000);
  float Example = 56543.67;
  int index = PositionComma(Example);
  Serial.print (index);

}

void loop() {
  // put your main code here, to run repeatedly: 

}

int PositionComma(float number){
  int indexnum=1;
  while(number > 10) 
  {
    number = number / 10.0;
    indexnum++;
  }
  return indexnum;
}

Non l'ho provato. Ma compila :D

EDIT: Il titolo del Topic potrebbe essere "Calcolare la posizione della virgola in un numero decimale" ;)

P.S. Senza offesa, ma Gingardu, nel modo di porre le domande mi ricorda un mio vecchio collega di Università che mi ha permesso di Laurearmi con una buona votazione. Studiando assieme, poneva domante talmente intricate che, per capirle e potergli rispondere, dovetti studiare benissimo tutte le materie. :cold_sweat: Bei tempi. Libero e felice senza moglie e figli. :zipper_mouth_face:

@ PaoloP tanks 8) è qualcosa del genere che intendevo anche se devo ancora provare tutto l'ambaradan,

mi aspettavo che il numero veniva contato dalla destra che nel tuo sketc doveva dare 3 invece che 5 comunque adesso provo

credo che gingardu abbia la necessità si sapere anche se nel numero c'è la virgola, per usare un display. Nella tua funzione avresti lo stesso risultato per i numeri 53 e 53.1 e 53.01 che credo per una funzione di display non vada bene.

una alternativa potrebbe essere qualcosa del genere:

char buf[9]; 
float num=53.01;
byte len; // lunghezza della stringa che rappresenta il numero
byte dotpos; // posizione del punto. se 0=nessun punto
....

dtostrf(num,0,2,buf);

len=strlen(buf);
dtpos=buf-strtok(buf,"."); // se torna 0 non c'è il punto

non ho compilato e ho fatto a memoria ma serve a illustrare quali funzioni e la logica. spero :-)

se gli serve sapere dov'è la la virgola basta fare (senta tirare in ballo le stringhe, per favore!)

copiaFloat = numeroFloat;
int a = copiaFloat;
int numeroDecimali=0;
while (a < copiaFloat){
    copiaFloat %= 10;
    numeroDecimali++;
}
int numeroInteri=0;
while (a > 0){
    a %= 10;
    numeroInteri++;
}

@ lesto @ brunialti

ho provato ad usare lo sketc ma non compila =(

beh il mio non è uno sketch, ma un pezzo di codice. Fino a quando uwe non manda la ricetta per la UWEbox© mi sa che devi postare il codice finale che hai usato e gli errori di compilazione.

lesto: Fino a quando uwe non manda la ricetta per la UWEbox©

Se vuoi ti vendo una AstroBox(tm) per solo 9999 Euro, un vero affare :grin:

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 :)

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;

%= 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

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)’

pablos: copiaFloat %= 10;

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

pablos: 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)'

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

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