Flottants et textes
Pourquoi un calcul décimal peut-il surprendre et un accent changer lors de la lecture d’un fichier ?
Environ 50 minutes
- Expliquer la représentation approchée des réels
- Comparer des flottants avec un critère de précision
- Distinguer ASCII, Latin-1, Unicode et UTF-8
- Convertir un fichier texte en préservant son contenu
Pourquoi un calcul décimal peut-il surprendre et un accent changer lors de la lecture d’un fichier ?
Les nombres et les textes deviennent des suites de bits selon des conventions différentes. Tu vas expliquer les approximations binaires, choisir une comparaison adaptée et convertir un texte entre encodages en contrôlant son contenu. Les fractions simples et la lecture des octets en hexadécimal servent de points de départ.
Une écriture binaire peut être infinie
Après la virgule en base deux, les positions portent les poids 1/2, 1/4, 1/8, 1/16 et ainsi de suite. On calcule la valeur en additionnant les poids dont le bit vaut 1. Ainsi 0,01₂ représente un quart, donc 0,25 en décimal. L’écriture 0,1₂ représente un demi : la même suite de chiffres n’a pas la même valeur selon sa base.
Pour convertir la partie fractionnaire d’un nombre positif inférieur à un, multiplie-la par deux. La partie entière du résultat devient le prochain bit ; recommence avec la nouvelle partie fractionnaire. Si celle-ci devient nulle, la conversion s’arrête. Sinon, l’écriture continue. Pour 0,25, on obtient 0,5 puis 1 : les bits sont 0 puis 1, d’où 0,01₂.
Exemple résolu
Écris exactement 0,625 en base deux et contrôle la conversion.
- Étape 1 : 0,625 × 2 = 1,25. Le premier bit après la virgule est 1 ; on conserve la partie fractionnaire 0,25.
- Étape 2 : 0,25 × 2 = 0,5. Le deuxième bit est 0 ; la nouvelle partie fractionnaire est 0,5.
- Étape 3 : 0,5 × 2 = 1. Le troisième bit est 1 et la partie fractionnaire est nulle : on s’arrête.
- Étape 4 : La vérification donne 1/2 + 0/4 + 1/8 = 5/8 = 0,625.
Résultat : 0,625₁₀ = 0,101₂ ; cette représentation binaire est finie et exacte.
Piège à éviter : Lire les bits dans l’ordre inverse confond cette méthode avec les divisions successives utilisées pour la partie entière.
Pour 0,1 en décimal, les parties fractionnaires successives sont 0,2, 0,4, 0,8, 0,6, puis de nouveau 0,2. Le cycle recommence : l’écriture binaire est 0,0001100110011…₂. Aucun nombre fini de positions binaires ne suffit. De même, un tiers s’écrit 0,010101…₂. Une écriture infinie en base deux n’empêche pas le nombre d’avoir une définition mathématique exacte.
Une fraction irréductible possède une écriture binaire finie lorsque son dénominateur est une puissance de deux. Le dénominateur 10 contient un facteur 5 : un dixième ne peut pas être une somme finie de puissances négatives de deux. À l’inverse, le dénominateur 8 convient. Cette propriété explique les cas rencontrés ; elle évite d’attribuer chaque écart à une panne de l’ordinateur.
À toi d'essayer
Sans lancer de programme, indique lesquels de 0,75, 0,2 et 0,375 ont une écriture binaire finie. Justifie avec des fractions irréductibles.
Voir la réponseMasquer la réponse
0,75 = 3/4 et 0,375 = 3/8 ont des dénominateurs puissances de deux : leurs écritures sont finies, respectivement 0,11₂ et 0,011₂. En revanche 0,2 = 1/5 a un dénominateur contenant un facteur 5 ; son écriture binaire est infinie.
Stocker une approximation et calculer avec elle
Un nombre flottant utilise un signe, une significande contenant les chiffres significatifs et un exposant qui déplace la position de la virgule. En base deux, on peut écrire 6,5 = 1,101₂ × 2². Un format informatique réserve un nombre limité de positions : il représente un ensemble fini de valeurs, pas tous les nombres réels. Les détails d’une norme de stockage ne sont pas nécessaires pour comprendre cette limitation.
Sur le dessin, les deux axes ont la même échelle. Le point vert du premier représente 2/16 = 0,125 ; celui du second représente 3/32 = 0,09375. La verticale orange est à 0,1. Avec une grille plus fine, une valeur représentable peut se rapprocher du nombre recherché. La valeur stockée reste distincte de ce nombre exact. Il s’agit ici de grilles simples pour comprendre l’arrondi.
Les flottants d’un programme introduisent généralement des arrondis lors de la conversion des données et des opérations. Un affichage court peut cacher l’écart : voir 0.1 à l’écran ne prouve pas que le stockage représente exactement un dixième. L’écart n’est pas toujours gênant, mais il peut changer le résultat d’un test d’égalité ou s’accumuler dans une suite d’opérations.
Exemple résolu
En Python, pourquoi le test (0.1 + 0.2) == 0.3 peut-il être faux ? Comment contrôler que l’écart est inférieur à un seuil donné ?
- Étape 1 : Les valeurs décimales 0,1 et 0,2 ont des écritures binaires infinies. Leurs flottants sont des approximations, et l’addition est elle aussi arrondie.
- Étape 2 : Sur l’interpréteur usuel, l’affichage de 0.1 + 0.2 donne 0.30000000000000004. Le flottant obtenu n’est pas identique à celui utilisé pour 0.3.
- Étape 3 : Calcule l’écart avec abs((0.1 + 0.2) - 0.3). Il est ici de l’ordre de 5,55 × 10⁻¹⁷.
- Étape 4 : Pour le seuil absolu fixé à 10⁻¹², le test abs((0.1 + 0.2) - 0.3) < 1e-12 est vrai. Le seuil répond à une précision attendue, il ne rétablit pas une égalité exacte.
Résultat : Le test d’égalité est faux, mais l’écart est inférieur au seuil choisi.
Piège à éviter : Un seuil pris au hasard peut accepter une erreur importante ou refuser une valeur suffisamment précise.
Le bon seuil dépend de l’unité et du problème. Un écart de 0,01 m représente un centimètre ; le même nombre en kilomètres représente dix mètres. Pour comparer des grandeurs d’ordres très différents, une tolérance relative peut compléter une tolérance absolue. La fonction math.isclose propose cette possibilité ; près de zéro, une tolérance absolue positive peut être nécessaire. Ne confonds pas proximité numérique et égalité mathématique.
Il reste possible de comparer exactement des entiers. Pour compter des objets, on utilise un entier, pas un flottant. La question pertinente est donc le type de donnée et la précision nécessaire. Évite aussi de piloter une boucle par l’égalité exacte entre une somme répétée de flottants et une valeur cible : un compteur entier puis un calcul de la valeur correspondante rend le nombre d’étapes explicite.
À toi d'essayer
Une sonde mesure des longueurs en mètres. On accepte une valeur mesurée m lorsque l’écart absolu avec la cible c est inférieur ou égal à 2 millimètres. Écris le test Python, puis décide pour c = 1 et m = 1,0015.
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
Distinguer caractères, points de code et octets
Un texte n’est pas stocké comme une image des lettres. Il faut associer des nombres aux caractères puis représenter ces nombres par des octets. Le caractère est l’élément du texte ; le glyphe est sa forme dessinée à l’écran. Une police change l’apparence, tandis qu’un encodage détermine les octets enregistrés. Changer de police ne corrige donc pas un fichier décodé avec la mauvaise convention.
ASCII définit 128 codes, représentables sur sept bits, pour des caractères de contrôle, les chiffres, des signes et les lettres latines non accentuées. Dans un fichier courant, un caractère ASCII occupe un octet. Il ne suffit pas pour écrire directement é. ISO-8859-1, souvent nommé Latin-1, utilise un octet et permet notamment de représenter plusieurs caractères accentués des langues d’Europe occidentale. Il ne couvre pas toutes les écritures.
Unicode associe des points de code à un vaste répertoire de caractères. La notation U+00E9 désigne le point de code du caractère é précomposé. Unicode n’impose pas que chaque caractère occupe un octet. UTF-8 est un encodage de ce répertoire : il emploie de un à quatre octets par point de code et conserve les octets ASCII pour les caractères correspondants.
La figure compare un seul caractère. En Latin-1, é correspond à l’octet E9 en hexadécimal, soit 11101001₂. En UTF-8, il correspond aux deux octets C3 A9, soit 11000011₂ puis 10101001₂. Le nombre de caractères et le nombre d’octets sont donc deux mesures différentes. Pour un texte composé uniquement de caractères ASCII, UTF-8 utilise un octet par caractère.
Une lettre accentuée visible peut aussi être décrite par une lettre suivie d’un signe combinant. Compter les points de code ne revient donc pas toujours à compter les symboles visibles. Dans les exemples de cette leçon, é est toujours le caractère précomposé U+00E9. Cette précision permet de comparer les encodages sans mélanger des représentations Unicode différentes.
Convertir un fichier sans perdre son texte
Encoder transforme un texte en octets selon une convention. Décoder transforme des octets en texte selon la convention annoncée. Pour convertir un fichier, il faut d’abord connaître son encodage de départ. Une suite d’octets seule peut être ambiguë : l’extension .txt ne suffit pas à identifier l’encodage. Cherche les informations fournies avec le fichier ou par le logiciel qui l’a créé.
Exemple résolu
Un fichier source.txt contient exactement le texte café, avec é précomposé, sans saut de ligne, en Latin-1. Comment obtenir une copie UTF-8 ?
- Étape 1 : Les octets de départ sont 63 61 66 E9 en hexadécimal. Le décodage Latin-1 donne les quatre caractères c, a, f, é.
- Étape 2 : En Python, après from pathlib import Path, lis le texte avec texte = Path('source.txt').read_text (encoding = 'latin-1'). L’argument encoding indique explicitement la convention d’entrée.
- Étape 3 : Écris un nouveau fichier avec Path('copie.txt').write_text (texte, encoding = 'utf-8'). L’original reste disponible pour vérifier la conversion.
- Étape 4 : Les octets de la copie sont 63 61 66 C3 A9, soit cinq octets. Relis copie.txt avec encoding = 'utf-8' et compare le texte obtenu à texte.
Résultat : La copie contient les mêmes quatre caractères et cinq octets au lieu de quatre.
Piège à éviter : Renommer le fichier ne convertit pas ses octets ; ignorer les erreurs de décodage peut supprimer des caractères.
Si tu décodes les octets UTF-8 C3 A9 comme du Latin-1, tu obtiens les deux caractères visibles é, pas é. À l’inverse, E9 seul n’est pas une séquence UTF-8 complète et valide. Un message d’erreur ou un texte étrange invite à vérifier l’encodage déclaré. Évite de remplacer automatiquement les caractères inconnus avant d’avoir identifié la cause : cette opération peut rendre la perte irréversible.
À toi d'essayer
On t’envoie deux fichiers censés contenir seulement le mot été, sans saut de ligne. Le premier a trois octets, le second cinq. Peut-on en déduire avec certitude leurs encodages ? Explique puis propose une vérification.
Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.
Au bac : justifier un choix de représentation
Ces connaissances de première préparent la poursuite en spécialité NSI. Une réponse attendue doit expliquer ce que le programme manipule et ce que l’observation permet réellement de conclure. La comparaison d’octets et l’analyse d’un arrondi sont deux démarches différentes.
Construire une réponse contrôlable
- Pour un nombre, distingue la valeur exacte, son écriture et sa représentation limitée. Montre la conversion sur quelques étapes avant de conclure sur son caractère fini ou infini.
- Pour une comparaison, précise la grandeur, l’unité et le seuil. Écris ensuite l’expression Python en respectant une borne stricte ou incluse.
- Pour un texte, nomme l’encodage de départ, celui d’arrivée et les caractères attendus. Compare les octets séparément du texte décodé.
- Conserve un fichier source et relis la copie avec le bon encodage. Un affichage plausible ne remplace pas une vérification du contenu complet.
Vocabulaire
- Flottant :
- Représentation numérique de précision limitée utilisant une significande et un exposant.
- Erreur absolue :
- Valeur absolue de la différence entre une approximation et la valeur de référence.
- Point de code :
- Numéro attribué à un caractère dans un répertoire comme Unicode.
- Encodage :
- Règle qui représente un texte par une suite d’octets.
- Décodage :
- Interprétation d’octets pour retrouver le texte selon un encodage donné.
Ne déduis pas l’exactitude du stockage du nombre de décimales affichées. Ne confonds pas ASCII et Unicode, ni Unicode et UTF-8. Ne suppose pas qu’un caractère visible occupe toujours un octet. Une conversion réussie conserve le texte, pas nécessairement la taille du fichier.
Bilan
| Donnée | Contrôle |
|---|---|
| Nombre approché | Écart et précision justifiée |
| Texte | Décodage explicite et contenu conservé |
Pour poursuivre, ouvre S’entraîner dans le hub Exercices du site, à l’adresse /exercices.
À retenir
- Les positions après la virgule binaire portent les poids 1/2, 1/4, 1/8 et les puissances négatives de deux suivantes.
- Un nombre flottant a une précision limitée ; certaines valeurs décimales sont approchées.
- Une comparaison de proximité utilise une tolérance justifiée par le problème et les unités.
- ASCII ne code pas les lettres accentuées ; Latin-1 en représente certaines sur un octet.
- Unicode définit un répertoire et des points de code ; UTF-8 les représente par des séquences d’octets.
Fiche de révision : Flottants et textes
Conversion binaire d’une fraction
multiplie par deux, prélève la partie entière puis recommence avec la partie fractionnaire. Un reste nul permet d’arrêter.
Pour 0,25, l’écriture 0,01₂ est exacte. Pour 0,1, la répétition des restes explique l’écriture infinie et la nécessité d’un arrondi.
Contrôle numérique
calcule un écart et compare-le au seuil exprimé dans la même unité. Un booléen vrai signifie seulement que ce critère est satisfait.
Contrôle d’un texte
octets source → décodage explicite → texte → encodage cible → nouveaux octets. Une relecture doit restituer le texte attendu.
Repère concret
é précomposé donne E9 en Latin-1, C3 A9 en UTF-8. Le nombre d’octets change alors que le caractère reste identique.
Et maintenant ?
Tu as lu le cours. L’étape suivante tient en une action.
Relis le coursLes exercices de ce chapitre arrivent bientôt.Prolonge l’expérience !
Continue à explorer ce chapitre à travers de nouvelles activités, des défis et des expériences interactives. Avec Premium, l’apprentissage continue !
Ici, tu débloques aussi 2 corrections détaillées.
Parent ? Suivez les progrès de votre enfant.
