ExerciceSeconde, chapitre 5 — Géométrie cartésienne · Applications Python
Exercice 21
On donne la fonction suivante, qui teste si un triangle est isocèle :
from math import sqrt
def distance(xA, yA, xB, yB):
return sqrt((xB - xA)**2 + (yB - yA)**2)
def est_isocele(xA, yA, xB, yB, xC, yC):
AB = distance(xA, yA, xB, yB)
AC = distance(xA, yA, xC, yC)
BC = distance(xB, yB, xC, yC)
if AB == AC or AB == BC or AC == BC:
return True
else:
return False1. Que renvoie l'appel est_isocele(0, 0, 6, 0, 3, 5) ?
2. Tester la fonction sur les quatre triangles de l'exercice 16.
3. Le test AB == AC porte sur des valeurs approchées. Expliquer pourquoi ce programme peut parfois répondre False alors que le triangle est bel et bien isocèle.
4. Écrire une fonction est_rectangle qui teste si un triangle est rectangle. On travaillera sur les carrés des longueurs, afin d'éviter toute racine carrée : pourquoi est-ce plus fiable ?
Corrigé
1. Le triangle a pour côtés , et : il est isocèle, donc
2. En reprenant les quatre triangles de l'exercice 16 : Seuls les triangles 1 et 3 sont isocèles.
3. La fonction sqrt ne renvoie qu'une valeur approchée. Deux longueurs théoriquement égales, comme et , peuvent être calculées par deux chemins différents et différer de très peu dans la mémoire de la machine — par exemple et . Le test AB == AC renvoie alors False alors que le triangle est bel et bien isocèle.
4. On compare les carrés des longueurs, qui sont des entiers lorsque les coordonnées le sont :
def carre_distance(xA, yA, xB, yB):
return (xB - xA)**2 + (yB - yA)**2
def est_rectangle(xA, yA, xB, yB, xC, yC):
AB = carre_distance(xA, yA, xB, yB)
AC = carre_distance(xA, yA, xC, yC)
BC = carre_distance(xB, yB, xC, yC)
if AB + AC == BC or AB + BC == AC or AC + BC == AB:
return True
else:
return FalsePourquoi est-ce plus fiable ? Aucune racine carrée n'apparaît : tous les calculs se font sur des entiers, que la machine manipule de façon exacte. Le test d'égalité est alors parfaitement sûr.