Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur(s) sémantique(s) ? Mon triangle est mal identifié

Programme "Mathématiques" et simple

Sujet résolu
    10 juillet 2010 à 17:03:10

    Bonjour,

    J'apprend aujourd'hui le Python et mes connaissances actuelles sont suffisantes pour construire un petit programme en console ; le programme (simplifié pour le forum) sait reconnaître si 3 longueurs peuvent former un triangle et si elles forment un triangle alors le programme identifie la nature du triangle.
    Mon problème est pour un cas particulier des triangles : les triangles isocèles rectangles.
    Mon programme identifie mon triangle de côtés 1 ; 1 et sqrt(2) comme un triangle isocèle or c'est un triangle isocèle rectangle.

    Voici mon programme :
    from math import sqrt
    a, b, c = 1, sqrt(2), 1
    
    
    # On regarde d'abord si les longueurs fournis peuvent former un triangle ?
    if (a <= (b + c) and b <= (a + c) and c <= (a + b)):
        # C'est un triangle ! Mais de quelle nature ?
    
        if ( a == b or b == c or a == c ):  # Test pour un triangle dont au moins deux côtés sont égaux.
            if ( a == b == c ):   
                print "Le triangle est équilatéral !"
               # Si la relation de Pythagore est vérifiée alors...
            elif ( a**2 == (b**2 + c**2) or b**2 == (a**2 + c**2) or c**2 == (a**2 + b**2)): 
                print "Le triangle est isocèle rectangle !" # ...le triangle est isocèle rectangle [ne marche pas].
            else:  # Sinon seulement deux côtés sont égaux alors...
                print "Le triangle est isocèle !"           # ...c'est un triangle isocèle.
           # Si la relation de Pythagore est vérifiée alors...
        elif ( a**2 == (b**2 + c**2) or b**2 == (a**2 + c**2) or c**2 == (a**2 + b**2) ): 
            print "Le triangle est rectangle !"       # ...le triangle est rectangle.
        else:
            print "Le triangle est quelconque !"
    


    Je pense que l'erreur est sémantique (hypothèse 1) mais j'ai beau relire mon code je ne la trouve pas et quand on modifie les variables a, b, c tels que 4, 5, 3 le triangle est bien identifié comme rectangle.

    J'ai une seconde hypothèse : l'ordinateur ne sait pas "calculer" ? :-°
    Car quand on essaye le code suivant dans notre IDLE :
    >>> from math import sqrt
    >>> (sqrt(2))**2
    

    Le résultat est le suivant : 2.0000000000000004
    (J'ai mis moi même le 4 en couleur.)
    Or racine carré de 2 au carré fait 2 ! Et si cette hypothèse est vraie alors mon code est exacte et c'est une erreur de calcul de l'ordinateur.
    Si cette hypothèse est vérifié peut-être avez vous d'autres triangles isocèles rectangles ? :)

    Merci d'avance pour votre aide.

    PS : je suis sous Windows Vista

    • Partager sur Facebook
    • Partager sur Twitter
      10 juillet 2010 à 17:10:32

      Oui, on ne peut pas en demander trop en terme de précision aux nombres flottants.
      • Partager sur Facebook
      • Partager sur Twitter
        10 juillet 2010 à 17:13:22

        Citation : EMC1

        Oui, on ne peut pas en demander trop en terme de précision aux nombres flottants.



        :( C'est dommage !! Hypothèse 2 vérifié donc ?!
        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2010 à 18:10:44

          En quelque sorte. Cette imprécision est liée au fonctionnement même des ordinateurs d'aujourd'hui, et pour la contourner, il faut soit travailler avec une représentation différente (avec tous les soucis que ça peut entraîner : par exemple, pour un rationnel, on le code facilement par un couple d'entiers, mais comment faire pour sqrt(2) ? En fait on laissera toujours des nombres de côté), soit redéfinir l'égalité entre flottants pour qu'elle soit un peu moins précise (à 10-15 près par exemple).
          • Partager sur Facebook
          • Partager sur Twitter
            10 juillet 2010 à 18:11:35

            En passant, en triant tes cotés par ordre croissant, tu pourrais éviter des tests, non?
            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              10 juillet 2010 à 18:45:27

              Citation : marshal caine


              :( C'est dommage !! Hypothèse 2 vérifié donc ?!



              Oui. Si tu ne veux pas de calcul approché, il faut raisonner de manière formelle comme le font certains outils comme Maple ou Sage (concurrent déclaré de Maple, à base de Python).

              Ton exo est intéressant (la nature du triangle), on pourrait imaginer l'analogue avec des quadrilatères (parallélogramme, carré, etc). Pour rendre plus réaliste ton exo, on pourrait donner des sommets du plan ou de l'espace à coordonnées entières, ça ferait un exo sympa, plus de problème de flottants en passant aux carrés.


              • Partager sur Facebook
              • Partager sur Twitter
                10 juillet 2010 à 19:11:56

                Ça revient à changer la représentation des nombres réels : c'est une possibilité, mais exclure les points à coordonnées non entières est dommage : si je veux trouver la nature d'un triangle de côtés sqrt(2), sqrt(3), sqrt(5), comment trouver rapidement des coordonnées qui correspondent (même à une homothétie près) ?
                En plus, on va toujours exclure certains nombres réels (mais ça de toute façon, ce sera toujours le cas).
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juillet 2010 à 19:28:20

                  Citation : Maxibolt

                  Ça revient à changer la représentation des nombres réels : c'est une possibilité, mais exclure les points à coordonnées non entières est dommage : si je veux trouver la nature d'un triangle de côtés sqrt(2), sqrt(3), sqrt(5), comment trouver rapidement des coordonnées qui correspondent (même à une homothétie près) ?
                  En plus, on va toujours exclure certains nombres réels (mais ça de toute façon, ce sera toujours le cas).



                  Bien sûr que le programme est plus limité si on ne garde que les points de ZxZ.

                  Mais d'une part, l'intérêt (ou l'utilité) du programme est vraiment limitée qu'il s'agisse de flottant ou d'entiers, il est clair que c'est surtout un prétexte pour faire du Python avec un objectif de codage compréhensible. La sémantique du programme est respectée. En ayant une feuille de papier quadrillé sous les yeux, on a la satisfaction de vérifier la véracité des réponses donné par le programme.


                  Par contre, comme il n'existe pas de triangle équilatéral à coordonnées entières, il vaut donc mieux prendre l'exemple des quadrilatères et faire tester carré, rectangle, losange, parallélogramme, rien. Autre idée, mais on s'éloigne un peu : est-il convexe ?


                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    10 juillet 2010 à 20:56:05

                    >>> from math import sqrt
                    >>> from decimal import Decimal as D
                    >>> D(str(sqrt(2)**2))
                    Decimal('2.0')
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 juillet 2010 à 21:05:38

                      Citation : fred1599

                      >>> from math import sqrt
                      >>> from decimal import Decimal as D
                      >>> D(str(sqrt(2)**2))
                      Decimal('2.0')


                      Chez moi :

                      >>> from math import sqrt
                      >>> str(sqrt(2)**2)
                      '2.0'
                      >>>
                      


                      donc Decimal n'y est peut-être pour rien.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        10 juillet 2010 à 22:09:29

                        En effet bizarre

                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 juillet 2010 à 22:14:28

                          Non, c'est juste une fonctionnalité de Python 3.1 (cf. la news http://www.siteduzero.com/news-62-3246 [...] nche-3-x.html ) qui permet de rendre l'affichage de décimaux plus esthétique.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            10 juillet 2010 à 23:06:39

                            Euh je ne comprend pas, je suis en version 2.6

                            o_O
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 juillet 2010 à 23:13:25

                              Pour Decimal, ça ne change rien. C'est pour le code de Candide : en interne, le nombre est le même (quelque chose comme 2.000000004), mais son affichage est plus joli.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Erreur(s) sémantique(s) ? Mon triangle est mal identifié

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown