Pagina 1 di 1

Float, non mi carica il valore nella variabile

MessaggioInviato: 6 ott 2013, 11:14
da MarcRider
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();

Re: float , non mi carica il valore nella variabile

MessaggioInviato: 6 ott 2013, 12:22
da AndryBest
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.

Re: float , non mi carica il valore nella variabile

MessaggioInviato: 6 ott 2013, 12:44
da simo85
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.

Re: float , non mi carica il valore nella variabile

MessaggioInviato: 6 ott 2013, 21:03
da MarcRider
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!

Re: Float, non mi carica il valore nella variabile

MessaggioInviato: 8 ott 2013, 9:07
da Shockwaver
Se vuoi ottimizzare, castare il numeratore dovrebbe essere sufficiente
Codice: Seleziona tutto
fVar = (float)1/Fclock;