[Programmation] XC8 ne sait apparemment pas calculer...
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

XC8 ne sait apparemment pas calculer...



  1. #1
    scaypapa

    XC8 ne sait apparemment pas calculer...


    ------

    Bonjour,

    Je cherchais à partir d'un paramètre A à retrouver la solution à l'équation x*(x-1) = A
    La solution complète est x = (1 ± √(4*A + 1)) / 2.
    Comme je cherche une solution positive et que la racine de 5 est > 1, je peux considérer que x = (1 + √(4*A + 1)) / 2
    Je veux un résultat entier et j'ai trouvé ici la fonction ceil() qui retourne la valeur entière supérieure ou égale au paramètre qui lui est passé.

    Mon calcul final est donc
    Code:
    x = ceil ((1 + sqrt(4*A + 1)) / 2);
    Mais là, j'ai un petit problème : Pour des valeurs intermédiaires de A, où on tombe sur un float, ceil retourne la bonne valeur.
    En revanche, si je rentre une valeur pour A qui devrait retourner une valeur entière pour x, ceil retourne parfois la valeur supérieure, parfois la bonne valeur.

    J'ai retiré la fonction ceil de mon code pour visualiser la valeur calculée pour
    Code:
    x = (1 + sqrt(4*A + 1)) / 2;
    Par exemple pour A = 6, on devrait avoir x = (1+√25)/2 = 3, mais XC8 trouve x = 3.000061
    Pour A = 12, on devrait avoir x = (1+√49)/2 = 4, mais XC8 trouve x = 4.000122
    Pour A = 20, on devrait avoir x = (1+√81)/2 = 5... et XC8 trouve bien x = 5.0
    A partir de là, ça fonctionne correctement pour les A = 30 et A = 42.
    Pour A = 56, encore une fois, on devrait trouver x = 8 et XC8 trouve x = 8.000244
    Etc...

    Avez-vous une idée d'où peut venir le problème et comment le contourner ?
    Comment se fait-il que le calcul soit erroné ?

    -----
    Dernière modification par scaypapa ; 17/11/2016 à 13h53.

  2. #2
    mag1

    Re : XC8 ne sait apparemment pas calculer...

    Bonjour,

    Heureux temps où on calculait à la règle à calculs, on ne se préoccupait pas de la quatrième décimale..

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  3. #3
    bastien31

    Re : XC8 ne sait apparemment pas calculer...

    Tu découvre les joies des flottants.
    Un flottant et codé sur 32 bit, tu ne peux coder qu'un nombre finie de valeurs.
    Certaines valeurs sont donc impossible à coder, cela créer des approximation et se ressent sur le résultat final.
    Essaye de travailer avec du double mais attention le temps de calcul.

  4. #4
    scaypapa

    Re : XC8 ne sait apparemment pas calculer...

    Merci pour ta réponse. J'imaginais bien que ce n'était pas en soi une "erreur" de XC8. Mais sachant pourquoi il se trompe, je pense pouvoir utiliser un arrondi à deux décmales avec round(100* monCalcul) / 100 avant de passer la fonction ceil (je n'ai pas trouvé en C de fonction du genre round(monCalcul, 2) pour arrondir directement à 2 décimales...
    Utilisant ce calcul pour définir une constante en #define, je ne suis pas sûr de pouvoir choisir un "float" ou un "double", ma "variable" est une constante de paramétrage du programme.

    Voici donc mon code final (et qui fonctionne )
    Code:
    // ======== CONFIGURATION ========
    #define NbBoutons   6
    // ===========================
    
    #define NbEntrees   ceil (round(100 * ((1 + sqrt(4*NbBoutons + 1)) / 2)) / 100)
    Merci beaucoup
    Dernière modification par scaypapa ; 17/11/2016 à 19h46.

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

    Re : XC8 ne sait apparemment pas calculer...

    Pense à faire l'inverse : NbBoutons = f(NbEntrees).

    De même si tu veux comparer y à racine de x,
    tu peux contourner le problème en comparant y² à x.

  7. #6
    RISC

    Re : XC8 ne sait apparemment pas calculer...

    Salut,
    Un point à ne pas oublier est que le compilateur XC8 travaille par défaut sur des flottants de 24 bits (pas 32bits). (voir chapitre 5.4.3 du manual du compilateur XC8)
    Cela permet d'accélérer les calculs au dépend de la précision. si on souhaite le "vrai" mode flottant 32bits (IEEE 754) , il faut modifier les options du compilateur dans les propriétés du projet.
    Autre chose, les "double float" s'ils existent dans le programme, sont automatiquement convertis en "float".
    a+

Discussions similaires

  1. Champignons dans mon apparemment
    Par Marcosof dans le forum Identification des espèces animales ou végétales
    Réponses: 2
    Dernier message: 27/04/2016, 06h59
  2. Un champignon (apparemment) à identifier.
    Par Cendres dans le forum Identification des espèces animales ou végétales
    Réponses: 5
    Dernier message: 27/11/2014, 21h00
  3. Réponses: 14
    Dernier message: 04/09/2013, 18h47
  4. Apparemment il y aura de la vie
    Par el_ukreniano dans le forum À la conquête de Mars
    Réponses: 11
    Dernier message: 24/05/2009, 00h53
  5. Qui sait ? Moi je sais pas ! Sait-on jamais ?
    Par Rann dans le forum Discussions scientifiques
    Réponses: 1
    Dernier message: 08/05/2007, 13h33
Découvrez nos comparatifs produits sur l'informatique et les technologies.