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.
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.
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
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.
Bei tempi. Libero e felice senza moglie e figli.
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++;
}
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ì:
sketch_oct11b:8: error: invalid operands of types 'float' and 'int' to binary 'operator%'
sketch_oct11b:8: error: in evaluation of 'operator%=(float, int)'
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ì: