Python stocke les nombres à virgule en binaire (norme IEEE 754) : 0,1 n'a pas d'écriture exacte, il est remplacé par la valeur la plus proche. Une boucle qui ajoute dix fois 0,1 donne 0,9999999999999999 : l'erreur de 1,1 × 10⁻¹⁶ est minuscule, mais le test total == 1.0 renvoie False. Sur 10 000 additions, l'erreur monte à 1,6 × 10⁻¹⁰ et 9 982 des 10 000 cumuls sont inexacts. Ce n'est pas un défaut de Python : tous les langages qui utilisent des flottants font pareil.
Écrire 1/3 en décimal : 0,333… on s'arrête quelque part, et trois tiers ne font plus tout à fait 1.
Un nombre à virgule Python (type float) occupe 64 bits. Comme 1/3 n'a pas d'écriture décimale finie, 0,1 n'a pas d'écriture binaire finie : Python garde la valeur représentable la plus proche. Chaque addition arrondit encore le résultat, et ces arrondis s'accumulent. Entre deux flottants voisins il y a un écart, l'ulp, qui grandit avec la valeur : 2,2 × 10⁻¹⁶ près de 1, 2 près de 10¹⁶.
Réglez le nombre d'additions et la valeur ajoutée à chaque tour. La courbe donne l'erreur absolue du cumul après chaque addition, par rapport à la valeur exacte ; le point blanc est l'erreur après la dernière addition.
Calcul avec les mêmes flottants 64 bits que Python ; la valeur exacte est (n × k) ÷ 100, calculée en une seule division.
La courbe donne l'écart entre deux flottants voisins (échelle logarithmique) selon la puissance de 10 du nombre. Près de 1 il vaut 2,2 × 10⁻¹⁶ ; près de 10⁶, 1,2 × 10⁻¹⁰ ; près de 10¹², 1,2 × 10⁻⁴ ; près de 10¹⁶, 2 : ajouter 1 à 2.0**53 ne change plus rien (float(2**53) + 1 == float(2**53) vaut True).
Chips : écart (ulp) donné par math.ulp(10**k) ; les deux axes sont logarithmiques.
Voici la démarche, puis un exemple.
import math total = 0.0 for _ in range(10): total += 0.1 total # 0.9999999999999999 total == 1.0 # False math.isclose(total, 1.0) # True : on compare avec une tolérance float(2**53) + 1 == float(2**53) # True : au-delà de 2**53, +1 disparaît
Puisque les nombres à virgule sont approchés, que fait round() quand une valeur tombe pile au milieu ? Python ne fait pas ce qu'on a appris à l'école.
Statistiques, finance quantitative, machine learning, deep learning, LLM, agents IA, MLOps : 321 épisodes avec des simulateurs à manipuler, pas des vidéos.
Statistics, quantitative finance, machine learning, deep learning, LLMs, AI agents, MLOps: 321 interactive episodes with simulators to play with, not videos.