Go Down

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

gingardu

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 
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

astrobeed

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.

gingardu

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

pablos

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.
no comment

PaoloP

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

gingardu


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

e precisamente come si fa ?
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

uwefed

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

astrobeed


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.


PaoloP

#8
Oct 10, 2012, 05:43 pm Last Edit: Oct 10, 2012, 05:49 pm by PaoloP Reason: 1
ripensandoci potresti fare così

Code: [Select]
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.  :smiley-roll-sweat:
Bei tempi. Libero e felice senza moglie e figli.  :smiley-zipper:

gingardu

@ 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   
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

brunialti

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:

Code: [Select]
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 :-)

lesto

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

copiaFloat = numeroFloat;
int a = copiaFloat;
int numeroDecimali=0;
while (a < copiaFloat){
    copiaFloat %= 10;
    numeroDecimali++;
}
int numeroInteri=0;
while (a > 0){
    a %= 10;
    numeroInteri++;
}
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

gingardu

@ lesto
@ brunialti

ho provato ad usare lo sketc    ma non compila  =(
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

lesto

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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


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  :smiley-mr-green:

Go Up