Représentation approximative des nombres réels
Nombre décimaux
Un nombre décimal est un nombre s'écrivant sous la forme `\frac{x}{10^{n}`, où $x$ est un entier relatif.
Nombre dyadiques
Par analogie avec les nombres décimaux, on appelle nombres dyadiques les nombres qui s'écrivent sous la forme `\frac{x}{2^{n}}`, avec $x$ entier relatif et $n$ entier.
Développement dyadique d'un nombre dyadique
On appelle développement dyadique d'un nombre dyadique l'écriture en binaire de ce nombre.
Ce développement dyadique est l'écriture en base 2 d'un nombre dyadique.
Ecriture binaire d'un nombre dyadique
Pour obtenir le développement dyadique d'un nombre dyadique `\frac{x}{2^{n}`, on prend le nombre binaire correspondant à $x$ et on insère une virgule avant le n-ième bit en partant de la fin.Ecrivons le développement dyadique de $2,5$.
Ecrire le développement dyadique de $31,25$
Cette méthode est fastidieuse parce qu'elle oblige de passer par l'écriture dyadique. De plus que faire des nombres qui ne sont pas dyadiques?
Partons tout de suite sur un exemple : comment représenter 5,1875 en binaire ?
Il nous faut déjà représenter 5, ça, pas de problème : 101
Comment représenter le ",1875" ?
On obtient une succession de "a + 0,b" ("0 + 0,375", "0 + 0,75", "1 + 0,5" et "1 + 0,0"). Il suffit maintenant de "prendre" tous les "a" (dans l'ordre de leur obtention) afin d'obtenir la partie décimale de notre nombre : 0011
Nous avons (101,0011)2 qui est la représentation binaire de (5,1875)10
Trouvez la représentation binaire de :
Il est possible de retrouver une représentation décimale en base 10 à partir d'une représentation en binaire.
Partons de (100,0101)2
Pas de problème pour la partie entière, nous obtenons "4".
Pour la partie décimale nous devons écrire : 0 x 2-1 + 1 x 2-2 + 0 x 2-3 + 1 x 2-4 = 0,3125.
Nous avons donc (4,3125)10
Trouvez la représentation décimale de : (100,001)2
En base dix, il est possible d'écrire les très grands nombres et les très petits nombres grâce aux "puissances de dix" (exemples 6,02.1023 ou 6,67.10-11). Il est possible de faire exactement la même chose avec une représentation binaire, puisque nous sommes en base 2, nous utiliserons des "puissances de deux" à la place des "puissances dix" (exemple 101,1101.210).
Pour passer d'une écriture sans "puissance de deux" à une écriture avec "puissance de deux", il suffit décaler la virgule : 1101,1001 = 1,1011001.211 pour passer de "1101,1001" à "1,1011001" nous avons décalé la virgule de 3 rangs vers la gauche d'où le "211" (attention de ne pas oublier que nous travaillons en base 2 le "11" correspond bien à un décalage de 3 rangs de la virgule, car (11) 2=(3)10).
Si l'on désire décaler la virgule vers la gauche, il va être nécessaire d'utiliser des "puissances de deux négatives" 0,0110 = 1,10.2-10, nous décalons la virgule de 2 rangs vers la droite, d'où le "-10"
Pour compléter ce cours, vous pouvez faire une recherche sur le norme IEEE-754 qui n'est pas au programme
Trouvez la représentation binaire de : (0,1)10
Que remarquez-vous ?
Il existe des nombres décimaux qui ne sont pas dyadiques. Ils n'acceptent pas de développement dyadique fini. Par conséquent leur représentation machine sera nécessairement tronquée. Cela engendrera des erreurs dans les opérations.
Il existe une anecdote illustrant ce problème:
Il ne faudrait surtout pas croire que ces petites erreurs de calcul et d’arrondi soient négligeables, et l’anecdote suivante devrait vous convaincre de l’importance qu’il y a à en prendre conscience. Le 25 février 1991, à Dharan en Arabie Saoudite, un missile Patriot américain a raté l’interception d’un missile Scud irakien, ce dernier provoquant la mort de 28 personnes. La commission d’enquête chargée de comprendre la raison de cet échec a mis en évidence le défaut suivant : L’horloge interne du missile Patriot mesure le temps en 1/10s. Pour obtenir le temps en seconde, le système multiplie ce nombre par 10 en utilisant un registre de 24 bits en virgule fixe. Or 1/10 n’est pas un nombre dyadique donc a été arrondi : le registre de 24 bits contient `0,00011001100110011001100_2` et induit une erreur binaire de `0,0000000000000000000000011001100..._2`, soit approximativement 0,000000095 en notation décimale. En multipliant cette quantité par le nombre de 1/10s pendant 100h (le temps écoulé entre la mise en marche du système et le lancement du missile Patriot), on obtient le décalage entre l’horloge interne de missile et le temps réel, soit : 0,000000095 × 100 × 3600 × 10 ≈ 0,34s. Or un missile Scud vole à la vitesse approximative de 1,676m/s donc parcourt plus de 500m en 0,34s, ce qui le fait largement sortir de la zone d’acquisition de sa cible par le missile d’interception 7Cette anecdote est tirée d'un site intéressant : catastrophes numériques
decbin(n)
qui à un entier n renvoie sa décomposition en binaire sous forme de liste.Ecrire en python une fonction deci_en_bin(n)
qui a un nombre décimal n
renvoie son écriture binaire sur 24 bits sous la forme d'une liste. La virgule sera une chaine de caractère.
bindec(l)
qui a une liste de correspondant à l'écriture en binaire d'un nombre renvoie le nombre codé en décimal.recherche_de_position(l)
qui a une liste de longueur 24 renvoie la position du caractère ,
ou True
si le caractère n'est pas présent.bin_en_deci(l)
qui a un nombre en binaire l écrit sur 24 bits sous la forme d'une liste renvoie le décimal en base 10 correspondant.
Les différents
auteurs mettent l'ensemble du site à disposition selon les termes de la licence Creative
Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0
International