Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Float, non mi carica il valore nella variabile

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Float, non mi carica il valore nella variabile

Messaggioda Foto UtenteMarcRider » 6 ott 2013, 11:14

ho scritto semplicemente alcuni calcoli o assegnazioni a delle veriabili float, eppure il compilatore in modalità debug con il simulator fa un casino.

Codice: Seleziona tutto
float TC = 0.5f;//(1/Fclock);


Se imposto la visualizzazione a IEEE float, allora visualizzo 0.5. Ma se già volessi fare 1/2000000 , mi da dei risultati strani, altre variabili dello stesso tipo danno 23 come risultato, tutto un po strano. prima ho fatto le prove con il c18 3.40 poi con 3.46.

Codice: Seleziona tutto
         
          long Fclock = (8000000 / 4);               
         float TC = (1/Fclock);                           
         float Tms = 0.0001/TC;                                   
         long ritardo = 1 * Tms;
         long i = 0;
        for(i = 0;i < ritardo;i++ ) Nop();
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

1
voti

[2] Re: float , non mi carica il valore nella variabile

Messaggioda Foto UtenteAndryBest » 6 ott 2013, 12:22

Ciao.
Ho fatto due prove compilandolo su PC e in effetti "float TC = (1/Fclock)" restituisce zero.
Come se non bastasse poi "float Tms = 0.0001/TC" restituisce infinito perché stai dividendo per zero.
Pertanto "long ritardo = 1 * Tms" restituisce -9223372036854775808 che è il valore minimo che può assumere un long ossia -(2^63).

Penso che il problema sia dovuto al fatto che nella riga "float TC = (1/Fclock)" considera l'uno come int e Fclock come long int, quindi fa una divisione fra interi (che in questo caso restituisce zero) e DOPO la copia nella variabile TC come float!
Prova specificando l'uno come float:
Codice: Seleziona tutto
float TC = (1f/Fclock)
// oppure
float TC = (1.0/Fclock)

Così dovrebbe funzionare.
Avatar utente
Foto UtenteAndryBest
25 2
 
Messaggi: 16
Iscritto il: 4 lug 2011, 14:57

1
voti

[3] Re: float , non mi carica il valore nella variabile

Messaggioda Foto Utentesimo85 » 6 ott 2013, 12:44

Codice: Seleziona tutto
float TC = (1/Fclock);

Non puoi ottenere una variabile a virgola mobile con una divisione di interi, tanto meno se il risultato deve essere minore di 1.
Devi effettuare un casting come da esempio:

Codice: Seleziona tutto
#include <stdio.h>

int main(void)
{
   long Fclock = (8000000 / 4);               
   float TC = (1/(float)Fclock);                           
   float Tms = 0.0001/TC;                                   
   long ritardo = 1 * Tms;
   long i = 0;

   printf("%ld\n", Fclock);
   printf("%.10e\n", TC);
   printf("%f\n", Tms);
   printf("%ld\n", ritardo);

   return 0;
}


Oppure fare come suggerito da Foto UtenteAndryBest.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[4] Re: float , non mi carica il valore nella variabile

Messaggioda Foto UtenteMarcRider » 6 ott 2013, 21:03

Grazie delle risposte, come mi suggerivate, non posso lasciare interi nelle operazioni, infatti ho dovuto castare anche l' "1" :

Codice: Seleziona tutto
   long Fclock = (8000000 / 4);
   float TC = ((float)1 /(float)Fclock);
   float Tms = 0.001/TC;
   long ritardo = 1 * Tms;
   long i = 0;


   for(i = 0;i > ritardo;i++ ) Nop();


Così adesso funziona.

grazie ragazzi!
Avatar utente
Foto UtenteMarcRider
5 1 4
New entry
New entry
 
Messaggi: 53
Iscritto il: 16 feb 2012, 17:37

0
voti

[5] Re: Float, non mi carica il valore nella variabile

Messaggioda Foto UtenteShockwaver » 8 ott 2013, 9:07

Se vuoi ottimizzare, castare il numeratore dovrebbe essere sufficiente
Codice: Seleziona tutto
fVar = (float)1/Fclock;
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti