Problème de math (égalité refusée), Deux valeurs égales sont considérées comme d

Résolu
Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 - 10 avril 2007 à 11:03
Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 - 12 avril 2007 à 11:57
Bonjour à tous.

Pour ceux qui voyagent aussi sur le forum Media-box, ce message vous sera peut-être famillié.

J'ai un gros problème, voyez-vous, j'ai un script qui déconne et je n'en comprends pas la raison.

Voici le problème :
J'ai fait un script qui me permet d'obtenir le coefficient angulaire et
le terme indépendant d'une droite passant par deux points donnés.
Code :

function equationDroite(aInitial:Array, aFinal:Array):Object{
        var objet        :Object        = new Object();
        if((aInitial[1] - aFinal[1]) == 0){
            objet.orientation            = "horizontal";
            objet.coefficientAngulaire    = 0;
            objet.termeIndependant        = aFinal[1];
        }else if((aFinal[0] - aInitial[0]) == 0){
            objet.orientation            = "vertical";
            objet.coefficientAngulaire    = 0;
            objet.termeIndependant        = aFinal[0];
        }else{
            objet.orientation            = "oblique";
            // Calcul du coéfficiant angulaire de la droite
            objet.coefficientAngulaire    = (aInitial[1] - aFinal[1])/(aInitial[0] - aFinal[0]);
            // Calcul du terme indépendant de la droite
            objet.termeIndependant        = aInitial[1] - aInitial[0]*objet.coefficientAngulaire;
        }
        var var1    :Number    = Math.floor(aFinal[0]*objet.coefficientAngulaire);
        var var2    :Number    = Math.floor(aFinal[1] - objet.termeIndependant);
        // Vérification des valeurs trouvées
        if(typeof(objet.coefficientAngulaire) != "number" || typeof(objet.termeIndependant) != "number"){
            trace("erreur 1");
        }else if(    objet.orientation == "oblique" &&
                    aFinal[1] != ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant)){
            trace("erreur 2");
        }else{
            return(objet);
        }
    }

Fin Code (en bleu foncé : le code d'où peut provenir le problème, en gris : le code supplémentaire mais qui n'est pas concerné c'est juste pour
info et enfin en rouge/rose : la vérification qui déconne)

Lorsque je le teste, pas de problème.

Sauf (bhein vi sinon je posterais pas), pour certaines valeurs Par exemple, quand je teste cette fonction avec les valeurs : aInitial [0, 0] et aFinal [19.25, 350]
Il me renvoit "erreur 2".

J'ai essayé de savoir quel étaient les différents résultats et j'obtiens ceci :

((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant) = 5.6843418860808e-14 <!--c2-->
<!--ec2-->
Or, lorsque je lui demande les informations morceaux par morceaux j'obtiens :
<!--c1-->
aFinal[0]*objet.coefficientAngulaire = 350 et objet.termeIndependant = 0;

J'ai essayé de mettre un Math.floor au cas où le problème viendrait de
mauvaises approximations mais j'ai beau tout faire, il veut pas lâcher
!
Il continue de me refuser ma condition ... mais le plus bizarre,
c'est que ce n'est pas systématique et que si on regarde c'est correct.
Parce que quand j'analyse les termes séparés, j'obtiens bien : 350 et 350 et quand je soustraits les termes entre eux, il me renvoit la valeur 5.6843418860808e-14 alors que (si je ne suis pas trop nul en math) 350 - 350 devrait me donner 0, non ?

Ce
terme "5.6843418860808e-14" est en plus considéré comme un chiffre
(pourtant chuis pas bigleux, y a bien une lettre et un - ... je penche
pour un exposant -14 mais chuis pas sûr ... )

Quelqu'un aurait une suggestion ?

J'ai bien envie de bazarder ma vérification mais je tenais à faire ma fonction le plus proprement possible

Pour
info, les chiffres utilisés viennent d'autres scripts mais j'ai isolé
le problème ... ce qui explique les valeurs décimales dans mes
coordonnées.

Merci d'avance à tous les fous qui prendront un peu de temps pour décortiquer ce bazard.

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
<!--c2-->
<!--ec2-->
A voir également:

6 réponses

kingcobra Messages postés 316 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 19 septembre 2012
12 avril 2007 à 00:13
salut,



bon une bonne nouvelle surement, je pense avoir trouvé ton probleme.

Je sais que t'en a deja parlé mais c'est bien un probleme d'arrondi. La trace ne fait qu'afficher ce que flash veut bien afficher...

Et le 350 calculé est en fait 350 et des brouettes ce qui est malheureusement bien différent de 350. Tu ne peux pas faire de floor() ou de ceil() car tu ne sais pas si c'est 350 + ou - une brouette. Donc c'est round(). Voici ta nouvelle condition :

else if (objet.orientation == "oblique" && aFinal[1] != Math.round(((aFinal[0]*objet.coefficientAngulaire)+objet.termeIndependant))) {


Et ça marche ;) .


KiNgCoBrA
3
kingcobra Messages postés 316 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 19 septembre 2012
10 avril 2007 à 18:20
Salut
Ben, déjà y'a un truc trop bisarre dans ton code :
Tu dis aInitial [0, 0] et aFinal [19.25, 350] mais ensuite tu fais des calculs sur des tableaux et des flottants...
Par exemple cette ligne, je ne sais même pas comment elle fait pour marcher. Tu multiplies un tableau avec un coefficient ?!!
aFinal[0]*objet.coefficientAngulaire = 350;

Si flash parle en adresse de tableau, c'est normal que tu ais des résultats tout bisarre.
Je m'y penche un peu plus tout à l'heure.


KiNgCoBrA
0
kingcobra Messages postés 316 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 19 septembre 2012
10 avril 2007 à 18:23
OOOps autant pour moi je pensais que c'était des tableau à 2 dimensions...

KiNgCoBrA
0
kingcobra Messages postés 316 Date d'inscription vendredi 23 mai 2003 Statut Membre Dernière intervention 19 septembre 2012
10 avril 2007 à 18:36
Donc, j'ai testé ta fonction (ça t'aidera peut être) :


Executé avec : equationDroite([0, 0],[19.25, 350]);
Voici la trace obtenue :


objet.orientation = oblique

aFinal[1] = 350

calcul = 3500

erreur 2

On a bien une erreur 2 car les termes sont différents ==> la condition renvoie vrai. Tout est normal, ton calcul est il celui que tu veux vraiment ?


KiNgCoBrA
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 1
11 avril 2007 à 13:42
Salut,

Merci de t'être penché sur mon cas.

Je ne comprends pas comment ton calcul vaut 3500. Est-ce bien le résultat de ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant) ? Parce que je n'obtiens pas la même chose que toi ...
J'ai retesté la fonction dans un nouveau fichier flash.

J'ai modifié le trace dans l'envoi de l'erreur 2 :
    trace("erreur 2 :: orientation " + objet.orientation + " :: vérification : " + aFinal[1] + " = = " + ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant));
Voici le résultat obtenu :
    erreur 2 :: orientation oblique :: vérification : 350 == 350

Or, pour moi et quoi qu'en pense Flash, 350 est égal à 350 !!!

Maintenant si je lui demande de me tracer la soustraction des membres (et voir ainsi si le résultat vaut ou non zéro) :
    trace("erreur 2 :: orientation " + objet.orientation + " :: vérification : " + aFinal[1] + " == " + ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant));
    trace("soustraction des membres : " + (aFinal[1] - ((aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant)));
J'obtiens ceci :
    erreur 2 :: orientation oblique :: vérification : 350 == 350
    soustraction des membres : -5.6843418860808e-14

Faut admettre qu'il y a un problème, non ?
Peux-tu me confirmer que si tu remplaces tes traces par ceux cités précédemment, tu continues à obtenir 3500 ?

Le but de mon calcul est d'obtenir le coefficient angulaire et le terme indépendant de la droite passant par deux points. La condition est là afin de vérifier que le calcul est correct.
Comme le terme indépendant est calculé d'après le point d'origine et que la droite doit passer aussi par le second point (aFinal), je vérifie la condition en comparant les deux membres.

Ca peut paraître totalement futile comme fonction, mais elle fait partie d'un ptit projet (délire). Elle a été incorporée dans une classe afin de pouvoir être réutilisée à volonté, c'est pour ça que j'aimerais résoudre ce (oui n'ayons pas peur des mots : ) BUG.

Je ne dis pas "bug" à la légère car ce calcul fonctionne bien dans d'autres cas... si tu essaies avec ces valeurs, tu n'auras aucune erreur
    equationDroite([0, 0],[20, 350]);
Etrange, non ?

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
0
Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 1
12 avril 2007 à 11:57
Salut,

Merci visiblement c'était bien ça.
Pour être sûr de mon coup et éviter d'éventuels problème, je vais légèrement modifier ma condition :
Code :
    if(    objet.orientation == "oblique" &&
           Math.round(aFinal[1] - (aFinal[0]*objet.coefficientAngulaire) + objet.termeIndependant) != 0){
Fin code

Sinon, c'est bizarre, il me semblait avoir testé via des floor et ça n'avait rien donné.
Enfin l'important c'est que ça marche. J'aurais préféré évité les arrondis afin de rester le plus précis possible, mais vaut mieux un arrondis qu'un bug, non ?

Je me tate en fait à mettre tout le projet dans une source... mmh à voir, est ce que ça en vaut vraiment la peine
En tout cas, encore une fois, un grand merci.

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
0
Rejoignez-nous