[C] - Problèmes de manipulation de variables de type float
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

[C] - Problèmes de manipulation de variables de type float



  1. #1
    jorg1n

    [C] - Problèmes de manipulation de variables de type float


    ------

    Bonjour,

    je rencontre un petit problème, j'utilise des variables de types float dans mon programme, je les affiche sur un glcd lorsque j'affiche un menu de configuration, et je peux régler cette variable (coefficient) par le biais de 2 BPs. Mais l'incrémentation et la décrémentation ne se passe pas toujours bien...
    Par exemple, j'ai une variable COEFT (float) qui peut varier de 0.05 à 0.95 et ça valeur initiale est 0.50:

    Code:
    float COEFT = 0.50
    Mais lorsque je souhaite la modifier par le biais de mes 2 BPs (+ / - 0.05 ):

    Code:
                if (RB0 == 0)          
                  {
                    COEFT=COEFT-0.05;   
                  }
                if (RB2 == 0)                                       
                  {
                    COEFT=COEFT+0.05;   
                  }
                if (COEFT >= 0.95)   
                  {                          
                    COEFT = 0.95; 
                  }  
                if (COEFT <=0.05)
                  { 
                    COEFT = 0.05;
                  }
    Elle est censé augmenter ou diminuer de 0.05, mais par exemple pour cette variable ci (car ça me le fais aussi sur d'autres variables de types float) et bien lorsque je décrémente de 0.05 ma variable COEFT alors qu'elle est égale a 0,85 (valeur affichée) elle passe à 0.79 et ensuite 0.74 ... avec toujours un décalage de 0.01...

    D'ou cela peut il venir, et comment résoudre le problème?

    J'espère que j'ai été assez clair dans mon explication, merci d'avance pour votre aide.

    Bonne journée à tous

    -----

  2. #2
    DAUDET78

    Re : [C] - Problèmes de manipulation de variables de type float

    C'est un problème d'arrondi. Un flottant 0.7500000 peut se stocker, en interne, par 0.7499999. il n'y a pas d'erreur (pour le processeur !).
    Une solution :
    Si ta variable doit évoluer de 0.00 à 0.95 par pas de 0.05, utilise un entier court de 00 à 95 que tu incrémentes de 5
    - pour l'affichage tu rajoutes "0." à gauche de la valeur "XY" : affichage "0.XY"
    - pour l'utilisation interne, tu rajoutes une division par 100 dans tes calculs
    J'aime pas le Grec

  3. #3
    jorg1n

    Re : [C] - Problèmes de manipulation de variables de type float

    Merci DAUDET78, (...te revoila donc...Merci bien)

    Bon, pour en savoir plus sur ce phénomène , j'ai fais un peu de pas à pas, et j'ai pu m'apercevoir que dans ma fenètre "Watch" (logiciel MPLAB) ma variable COEFT, avant de faire cette fonction:
    Code:
    ftoa (COEFT,DATAtoLCD,2);
    COEFT vaut bien 0.8000000 , par contre la variable DATAtoLCD prend dans son tableau:
    DATAtoLCD "0.79"

    Le "problème" viendrai donc de la fonction ftoa? bizarre bizarre...
    Pour toi DAUDET, on ne peut résoudre ce problème qu'en passant par une déclaration et un travail avec des INT?

    Voila au cas ou la fonction ftoa ();
    Code:
    void ftoa(float f,char* String,char Places){
    long power;
    char n,i;
        power=1;
        while(power*10<=f)
            power*=10;
        while(power>=1){
            n=(char)(f/power);
            f-=n*power;
            power/=10;
            *String++=n+'0';
        }
        *String++='.';
        for(i=0;i<Places;i++){
            f*=10;
            n=(char)f;
            f-=n;
            *String++=n+'0';
        }
        *String=0;
    }
    Merci d'avance

  4. #4
    DAUDET78

    Re : [C] - Problèmes de manipulation de variables de type float

    Je ne suis pas un spécialiste de C (je bricole un peu en VB6).
    Citation Envoyé par jorg1n Voir le message
    par contre la variable DATAtoLCD prend dans son tableau:
    DATAtoLCD "0.79"
    c'est un tableau de flottant ? (je ne m'y connais pas assez pour le voir !)

    J'ai dis que faire un tableau d'entier court était la solution que je prendrai, perso. Il y a d'autre solution certainement.
    J'aime pas le Grec

  5. A voir en vidéo sur Futura
  6. #5
    jorg1n

    Re : [C] - Problèmes de manipulation de variables de type float

    Merci quand même DAUDET,

    c'est un tableau de flottant ? (je ne m'y connais pas assez pour le voir !)
    Non, il s'agit d'un tableau de chaine de caractères pour l'envoyer ensuite vers mon glcd:
    Code:
    char DATAtoLCD[30];
    perso, le problème ne m'arrive qu'une fois, je vais donc faire un test sur le tableau DATAtoLCD du genre:

    Code:
    if(DATAtoLCD[3] == '9')
    		{
    		DATAtoLCD[3] = '0';
    		DATAtoLCD[2]++;
    		}
    
    if(DATAtoLCD[3] == '4')
    		{
    		DATAtoLCD[3] = '5';
    		}
    comme ça j'aurai quelque chose de correct au point de vu de l'affichage, et pour le calcul, ce n'est pas trop grave vu que ma valeur est bonne avant conversion en "char" ou alors elle est très proche :
    COEFT = 0.5499999 au lieu de 0.5500000, ce n'est pas trop génant pour moi...

    Par contre la prochaine fois, je m'y prendrai peut etre autrement... et si quelqu'un peut me dire pourquoi la fonction ftoa me sort "0.79" alors qu'en entrée elle reçoit un float de 0.800000, je suis preneur...je veux bien comprendre.

    Merci encore pour ton aide DAUDET78.

Discussions similaires

  1. [C] - Comparaison entre deux variables de type différent
    Par jorg1n dans le forum Électronique
    Réponses: 3
    Dernier message: 27/10/2008, 12h30
  2. envoyer float par USB- PIC18f4550
    Par titoff dans le forum Électronique
    Réponses: 9
    Dernier message: 28/07/2008, 20h18
  3. float
    Par invitedb0c35ce dans le forum Électronique
    Réponses: 3
    Dernier message: 24/02/2006, 19h46
  4. Géospace, manipulation de multiples variables.
    Par Keorl dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 13/02/2005, 11h08
  5. MATLAB: lecture de float dans un fichier RTF
    Par invitecd42c963 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 26/07/2004, 13h03
Découvrez nos comparatifs produits sur l'informatique et les technologies.