Les Nombres Flottants
0.1 + 0.2 = 0.3 ? En maths, oui. En Python... pas exactement ! Les nombres a virgule (flottants) sont APPROXIMATIFS. Cette imprecision peut causer des bugs subtils si on ne la comprend pas. Decouvrez pourquoi et comment l'eviter !
50 min Niveau 3/5 +40 XP
Objectifs
- Comprendre la notation scientifique et IEEE 754
- Identifier les problemes de precision des flottants
- Eviter les comparaisons directes de flottants
- Connaitre les valeurs speciales (inf, NaN)
ATTENTION : Pieges frequents
- !Comparer des flottants avec == (a != b)
- !Croire que 0.1 + 0.2 == 0.3
- !Ignorer les erreurs d'arrondi dans les boucles
- !Utiliser des flottants pour de l'argent (utiliser Decimal)
Cours complet
Les flottants sont stockes comme en notation scientifique : un signe, une mantisse, et un exposant. C'est le standard IEEE 754.
# Notation scientifique : M x 10^E # 12345 = 1.2345 x 10^4 # 0.0056 = 5.6 x 10^-3 # En Python, notation avec 'e' print(1.5e3) # 1500.0 (1.5 x 10^3) print(2.5e-2) # 0.025 (2.5 x 10^-2) print(6.022e23) # Nombre d'Avogadro # Le standard IEEE 754 (binaire) # Stocke : signe (1 bit) + exposant + mantisse # - Simple precision (32 bits) : 7 chiffres significatifs # - Double precision (64 bits) : 15-16 chiffres significatifs # Python utilise la double precision (64 bits) import sys print(sys.float_info) # Precision maximale print(sys.float_info.dig) # 15 chiffres significatifs print(sys.float_info.max) # ~1.8 x 10^308 (max) print(sys.float_info.min) # ~2.2 x 10^-308 (min positif) # La mantisse binaire # En binaire : 1.xxxxx x 2^E # Exemple : 5.75 = 101.11 = 1.0111 x 2^2
Quiz Flottants
5 questions pour valider
Le bug celebre
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False
Solution
import math
math.isclose(0.1+0.2, 0.3)
# True !
