Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

TP : implanter la fonction exponentielle (3/5)

Partie 3 : comparaison de nombres flottants et précision relative

Sur les nombres flottants (float) l’opérateur == n’est pas toujours très fiable à cause des erreurs d’arrondis :

1.0 + 1e20 - 1e20 == 1e20 - 1e20 + 1.0
False

Exécutez les cinq cellules suivantes. Que constatez-vous ?

BEGIN SOLUTION

a et b ont bien des valeurs différentes mais s’affichent de la même manière.

END SOLUTION

a = 16
b = 15.9999999999999999
a
16
b
16.0
(a == b)
True

Définition : précision relative

Chaque fois que l’on veut comparer deux nombres flottants, il faut spécifier avec quelle précision on veut les comparer.

Le plus simple est de fixer un seuil de précision absolue η\eta, c’est-à-dire la différence de valeur en dessous de laquelle on considère que deux nombres sont égaux : xyx \simeq y si xy<η|x - y| < \eta.

Cependant, cette valeur de précision absolue peut être difficile à fixer, surtout quand les valeurs sont très variables en ordre de grandeur. Par exemple, si l’on considère des hauteurs de pics montagneux, on pourrait largement se satisfaire d’être précis à la dizaine de mètres (η=101\eta = 10^1m) près. En revanche si l’on compare des tailles de personnes, on aimerait pouvoir être précis au centimètre (η=102\eta = 10^{-2}m). On aurait donc besoin de précisions absolues totalement différentes selon l’ordre de grandeur des valeurs.

En fait c’est le plus souvent le nombre de chiffres significatifs en commun qui est pertinent à mesurer. Formellement, on utilise alors une précision relative. Si on veut comparer xx et yy avec une précision relative de l’ordre de cinq chiffres significatifs, on prendra ε=105=0,00001\varepsilon=10^{-5}=0,00001, et on dira que xx est égal à yy à ε\varepsilon près si :

xy<εxetxy<εy|x - y| < \varepsilon|x| \qquad \text{et} \qquad |x - y| < \varepsilon |y|

Moralement : la différence entre xx et yy est négligeable devant xx et devant yy.

Ce concept est particulièrement pertinent dans notre cas, car l’exponentielle donne des valeurs d’ordres de grandeur très différents : e1100e^1 \simeq 10^0, e5102e^5 \simeq 10^2, e10105e^{10} \simeq 10^5 ...

Implantation

Implantez la fonction dont on vous donne la documentation :

Vous pouvez utiliser la fonction prédéfinie en Python abs(n) qui renvoie la valeur absolue du nombre n.

print(abs(-1.5))
print(abs(2.2))
1.5
2.2
def egal(x, y, epsilon):
    """Égalité entre deux flottants avec précision relative
    * Paramètre x : un flottant
    * Paramètre y : un flottant
    * Paramètre epsilon : flottant
    * @return true si la valeur absolue de x - y est plus petite que epsilon * |x| et que epsilon * |y|
    """
    ### BEGIN SOLUTION
    v = abs(x - y)
    return (v < epsilon * abs(x)) and (v < epsilon * abs(y))


### END SOLUTION
egal(15.999999, 16, 0.00001)
True
assert egal(15.999999, 16, 0.00001) == True
assert egal(15.99, 16, 0.00001) == False

Trouvez des valeurs de epsilon telles que les nombres ci-dessous soient considérés comme égaux par egal :

egal(15, 16, 0.001)
False
egal(0.0001, 0.002, 0.00001)
False

Que se passe-t-il lorsque xx ou yy valent 0 ?

BEGIN SOLUTION

Lorsque xx ou yy valent 0 (même lorsque les deux valent 0), la fonction egal renvoie toujours false. On ne peut pas parler de précision relative à zéro.

END SOLUTION

egal(0.00001, 0, 0.0000001)
False

Bilan de la partie 3

Maintenant que la notion de précision relative est bien définie, et que vous avez implanté la comparaison de nombres flottants avec une précision relative fixée, vous pouvez passer à la partie 4.