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

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 
Logged


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

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

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

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

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
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: 40
Posts: 3423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

no comment

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7178
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

Trasformi il numero in una stringa e con la funzione apposita cerchi la posizione del carattere virgola.
e precisamente come si fa ?
Logged


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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 269
Posts: 21836
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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.

Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7178
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ripensandoci potresti fare così

Code:
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  smiley-grin

EDIT: Il titolo del Topic potrebbe essere "Calcolare la posizione della virgola in un numero decimale"  smiley-wink

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
« Last Edit: October 10, 2012, 10:49:03 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

@ PaoloP   tanks   smiley-cool  è 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   
Logged


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

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 486
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se gli serve sapere dov'è la la virgola basta fare (senta tirare in ballo le stringhe, per favore!)
Code:
copiaFloat = numeroFloat;
int a = copiaFloat;
int numeroDecimali=0;
while (a < copiaFloat){
    copiaFloat %= 10;
    numeroDecimali++;
}
int numeroInteri=0;
while (a > 0){
    a %= 10;
    numeroInteri++;
}
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

@ lesto
@ brunialti

ho provato ad usare lo sketc    ma non compila  smiley-cry
Logged


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

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

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
Logged

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