Pourquoi Python affiche-t-il False quand on teste 0.1 + 0.2 == 0.3 ? Pourquoi un « é » devient-il parfois « é » sur une page Web ? Ces deux surprises viennent de la façon dont la machine code les nombres à virgule et les caractères. Ce chapitre explique ces deux représentations.

Une question sur ce cours ?
ULU, le tuteur d’ULUMINE, t’aide à partir de ce cours.
Objectifs
- Écrire en binaire un nombre à virgule simple et convertir un binaire à virgule en décimal
- Savoir que les flottants sont des valeurs approchées et ne pas tester leur égalité
- Connaître le principe du codage d’un flottant (signe, exposant, mantisse)
- Connaître les encodages ASCII, ISO-8859-1 et Unicode (UTF-8) et utiliser ord() et chr()
1. Les nombres à virgule en binaire
Après la virgule, les bits ont pour poids les puissances négatives de 2 : = 0,5 ; = 0,25 ; = 0,125 ; = 0,0625…
Du binaire au décimal
Convertir (101,11)2.
- Partie entière : 101 = 4 + 1 = 5.
- Partie fractionnaire : 0,11 = 0,5 + 0,25 = 0,75.
(101,11)2 = 5,75.
Du décimal au binaire (multiplications successives par 2)
Écrire 0,375 en binaire.
- 0,375 × 2 = 0,75 → bit 0
- 0,75 × 2 = 1,5 → bit 1, on garde 0,5
- 0,5 × 2 = 1,0 → bit 1, il reste 0 : on s’arrête.
0,375 = (0,011)2.
2. Les flottants
Flottant : Un flottant (type float en Python) code un nombre sous la forme signe × mantisse × 2exposant, comme une écriture scientifique en base 2. La norme IEEE 754 utilise 64 bits en double précision : 1 bit de signe, 11 bits d’exposant et 52 bits de mantisse.
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False
>>> abs((0.1 + 0.2) - 0.3) < 1e-9
TrueLes erreurs d’arrondi peuvent s’accumuler : ajouter dix fois 0.1 donne 0.9999999999999999 et non 1.0. Une boucle while x != 1.0 qui ajoute 0.1 à x ne s’arrête donc jamais.
3. Coder les caractères
Encodage : Un encodage associe à chaque caractère un nombre, puis une suite d’octets. Pour lire correctement un texte, il faut connaître l’encodage avec lequel il a été écrit.
| Encodage | Taille | Ce qu’il contient |
|---|---|---|
| ASCII (1963) | 7 bits : 128 caractères | lettres non accentuées, chiffres, ponctuation, caractères de contrôle |
| ISO-8859-1 (latin-1) | 8 bits : 256 caractères | ASCII + lettres accentuées d’Europe occidentale (é, à, ç…) |
| Unicode | plus d’un million de points de code possibles | les caractères de toutes les écritures du monde |
| UTF-8 | 1 à 4 octets par caractère | encodage d’Unicode le plus utilisé sur le Web ; compatible avec ASCII |
- En ASCII : 'A' = 65, 'Z' = 90, 'a' = 97, '0' = 48, l’espace = 32. Minuscule = majuscule + 32.
- En Unicode, « é » a le point de code U+00E9 (233) ; en UTF-8, il occupe 2 octets (C3 A9).
- Si un texte UTF-8 est lu comme du latin-1, chacun de ces 2 octets devient un caractère : « é » s’affiche « é ».
>>> ord("A")
65
>>> chr(97)
'a'
>>> "é".encode("utf-8")
b'\xc3\xa9'
>>> len("été".encode("utf-8"))
5À retenir
- Après la virgule, les bits valent , , … ; on convertit par multiplications successives par 2.
- Beaucoup de décimaux (comme 0,1) n’ont pas d’écriture binaire finie : les flottants sont des valeurs approchées.
- On ne compare pas deux flottants avec == mais avec abs(a − b) < epsilon.
- ASCII : 7 bits, 128 caractères ; ISO-8859-1 : 8 bits ; Unicode + UTF-8 : tous les caractères, 1 à 4 octets.
- ord(c) donne le code d’un caractère, chr(n) le caractère d’un code.

Et maintenant, à toi !
Vérifie que tu as compris avec les exercices, puis révise avec la fiche.