L'histoire des ordinateurs commence au milieu du XXe siècle. Si les premiers ordinateurs ont été réalisés après la Seconde Guerre mondiale, leur conception repose sur le résultat de divers prototypes tels que l'Harvard Mark I et le Z3, machines électromécaniques programmables commencées en 1939, et surtout de deux calculateurs électroniques : le Colossus du service de cryptanalyse britannique en 1943, l'ENIAC en 1945.
Actuellement, nos appareils numériques ne savent manipuler que des bits: une succession de 0 et de 1.Cela vient de la conception même de l'électronique actuelle.
On peut alors se poser la question sur la façon dont un appareil numérique manipule d'autres nombres que 0 et 1.
A copier dans le cahier.
En mathématique, il n'est pas obligatoire d'écrire un nombre en base 10.
Un nombre écrit sous la forme \(a_n a_{n-1} a_ {n-2} ... a_2 a_1 a_0\) en base \(b\) signifie qu'il est égal à :
$$ a_n \times b^n + a_{n-1} \times b^{n-1}+ a_ {n-2} \times b^{n-2} + ... +a_2 \times b^2 + a_1 \times b^1 + a_0 $$
A copier dans le cahier.
Sans mention particulière, si un nombre tel que 314 est écrit, cela sous entend qu'il est écrit en base 10.
La notation \( {a_n a_{n-1} a_ {n-2} ... a_2 a_1 a_0}_b\) sous entend que ce nombre est écrit en base \(b\).
Par exemple, \(1234_6\) sous entend que ce nombre est écrit en base 6.
A faire dans le cahier.
Convertir:
A faire dans le cahier.
Quel est le but du code suivant ?
Tests :
# Tests
Affichage :
Console:
Est programmé ci-dessous une deuxième fonction permettant de transformer un string qui représente un nombre écrit en binaire à deux chiffres et permettant de donner son écriture en base 10.
En suivant cet exemple :
trois_bits_vers_base_10
et qui prend comme paramètre un string de trois caractères et qui renvoie sa conversion en base 10 sous forme d'un integer.quatre_bits_vers_base_10
et qui prend comme paramètre un string de quatre caractères et qui renvoie sa conversion en base 10 sous forme d'un integer.Tests :
# Tests
Affichage :
Console:
L'exercice précédent est répétitif et l'on sent que l'on peut faire mieux car nous traitons des cas ressemblant à ceux déjà fait. Par exemple la conversion de '0000'
et de '00000'
sont similaires.
Si texte
est un string, texte[0]
désigne le premier caractère et texte[1:]
représente tout le string en
omettant le premier caractère.
Compléter la fonction ci-dessous qui utilisera quatre_bits_vers_base_10
:
Tests :
# Tests
Affichage :
Console:
Les exercices précédents pourraient durer indéfiniment.
Le but est maintenant de compléter la fonction binaire_vers_base_10
qui prend en paramètre un string composé de 0 et de 1
de n'importe quelle taille et qui retourne l'entier convertit en base 10.
Tests :
# Tests
Affichage :
Console:
Compléter la fonction base_10_vers_binaire_basique
qui prend en paramètre un integer x
compris entre 0 et 15 et qui renvoie un string correspondant à son écriture en base 2.
Tests :
# Tests
Affichage :
Console:
Pour passer d'un nombre écrit en base 10 à son écriture en base deux, on peut utiliser l'algorithme suivant.
Il suffit de faire des divisions par deux successives et de regarder les restes.
A faire dans le cahier.
A l'aide de la méthode précédente :
On considère la fonction binaire
à la page suivante. Cette fonction prend en paramètre
un entier positif a
en écriture décimale et renvoie son écriture binaire sous la forme d’une
chaine de caractères.
Exemples :
>>> binaire(0)
'0'
>>> binaire(77)
'1001101'
Tests :
# Tests
Affichage :
Console:
A copier dans le cahier.
En plus de la base de 2, il est indispensable de connaitre pour quelqu'un travaillant dans l'informatique la base 16 (hexadécimal).
Par convention le nombre \(10\) est associé à \(A_{16}\), 11 à \(B_{16}\) et ainsi de suite jusqu'à 15 qui est associé à \(F_{16}\).
A faire dans le cahier.
Convertir:
Créer une fonction caractere_hexa_vers_base_10
qui prend en paramètre un string d'un seul caractère et qui retourne
sa valeur en base 10.
Exemples :
>>> caractere_hexa_vers_base_10('0')
0
>>> caractere_hexa_vers_base_10('9')
9
>>> caractere_hexa_vers_base_10('B')
11
Tests :
# Tests
Affichage :
Console:
Compléter la fonction ci-dessous. Celle-ci utilisera la fonction caractere_hexa_vers_base_10
de l'exercice précédent.
Tests :
# Tests
Affichage :
Console:
A copier dans le cahier.
Un octet (Byte en anglais) est une succession de 8 bits.
A faire dans le cahier.
Lorsque qu'un nombre est écrit en base 16, on parle d'écriture en hexadécimale.
A copier dans le cahier.
On peut facilement passer d'une écriture en base 2 en base 16 et réciproquement.
Il suffit de remarquer qu'un nombre écrit en base 2 avec 4 caractères se convertit directement en base 16.
A copier dans le cahier.
Donc :
A faire dans le cahier.
Convertir:
A faire dans le cahier.
Poser et effectuer les opérations suivantes:
Limitons nous aux entiers écrits sur un octet :
Sur un octet, nous pouvons prendre le choix d'encoder soit un entier strictement positif soit un entier relatif c'est à dire pouvant être négatif
Pour cela, nous avons deux possibilités
Dans le cas d'un binaire non signé, l'écriture en base 2 d'un nombre et son écriture en binaire correspondent.
Par exemple, le nombre 16 peut être encodé sur un octet : 0001 0000
A copier dans le cahier.
Dans le cas d'un binaire signé, on utilise la méthode suivante:
Si c'est un entier positif, on utilise son écriture en base 2
Si c'est un entier négatif, on prend l'écriture de son opposé en base 2, puis son complément à 2 (on inverse les 0 et les 1) puis on ajoute 1
Essayons de trouver l'écriture du nombre -20 sur un octet.
L'écriture de -20 en binaire signé est 1110 1100 sur un octet.
Vérification :
$$ \begin{equation} \begin{aligned} &00010100_2 \\ + &11101100_2 \\ = \color{red}1&\color{green}00000000_2 \end{aligned} \end{equation} $$A faire dans le cahier.
Donner les écritures sur un octet des nombres suivants:
Un nombre écrit sous la forme \(a_n a_{n-1} ... a_ {1} a_ {0},a_ {-1} ... a_{-m}\) en base \(2\) signifie qu'il est égal à :
$$ a_n \times 2^{n} + a_{n-1} \times 2^{n-1}+...+ a_ 1 \times 2^1 +a_ 0 \times 2^0 + a_ {-1} \times 2^{-1} +... +a_{-m} \times 2^{-m}$$
Essayons de trouver l'écriture en base 10 du nombre \(101,011_2\).
$$ \begin{equation} \begin{aligned} \color{red}{101,011_2} &= \color{red}{1} \color{green}{ \times 2^2 +}\color{red}{0} \color{green}{\times 2^1 + }\color{red}{1} \color{green}{\times 2^0 + }\color{red}{0} \color{green}{\times 2^{-1} + }\color{red}{1} \color{green}{\times 2^{-2} + }\color{red}{1} \color{green}{\times 2^{-3}}\\ &= 4+1+\frac{1}{4} + \frac{1}{8} \\ &=4+1+0,25+0,125\\ &= 5,375 \end{aligned} \end{equation} $$Pour passer de la base 10 à la base 2, nous pouvons utiliser les algorithmes utilisés pour les nombres entiers. Mais parfois les écritures en base 2 comportent une infinité de chiffres après la virgule.
Essayons de trouver l'écriture en base 2 du nombre 5,25 :
La plus grande puissance de 2 intervenant est \(2^2\).
$$ \begin{equation} \begin{aligned} 5,25 &= 2^2+1,25\\ &= 2^2+2^0 + 0,25\\ &= 2^2+2^0+2^{-2}\\ &= 101,01_2 \end{aligned} \end{equation} $$Essayons de trouver l'écriture en base 2 du nombre 5,2 :
La plus grande puissance de 2 intervenant est \(2^2\).
$$ \begin{equation} \begin{aligned} 5,2 &= 2^2+1,2\\ &= 2^2+2^0 + 0,2\\ &= 2^2+2^0 + 0,125+0,075\\ &= 2^2+2^0+2^{-3}+0,075\\ &= 2^2+2^0+2^{-3}+0,0625+0,0125\\ &= 2^2+2^0+2^{-3}+2^{-4}+0,0125\\ &= 2^2+2^0+2^{-3}+2^{-4}+0.0078125 + 0,0046875\\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} +0,0046875\\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 0.00390625 +0.00078125\\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } +0.00078125 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 0.00048828125 + 0.00029296875 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 0.00029296875 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 0.000244140625 + 0.000048828125 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 2^{-12} + 0.000048828125 \\ &= 2^2+2^0+2^{-3}+2^{-4}+2^{-7} + 2^{-8 } + 2^{-11} + 2^{-12} + 2^{-15}+.............. \\ &=101,0011001100110011001100110011001100110011001100110011........_2 \end{aligned} \end{equation} $$Pour se persuader du nombre de chiffre après la virgule, on peut s'aider des égalités suivantes:
$$ \begin{equation} \begin{aligned} 0,2&=\frac{2}{10} \\ &=\frac{1}{5} \\ &=\frac{1}{8} + \frac{1}{16} + \frac{1}{80}\\ &= \frac{1}{8} + \frac{1}{16} + \frac{1}{16} \times \frac{1}{5} \\ &= 2^{-3} + 2^{-4} + 2^{-4} \times \color{red}(\frac{1}{5} ) \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-4} \times \color{red}(2^{-3} + 2^{-4} + 2^{-4} \times \color{green}(\frac{1}{5} ) \color{red}) \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-7}+ 2^{-8} + 2^{-8} \times \color{green}(\frac{1}{5} ) \color{black} \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-7}+ 2^{-8} + 2^{-8} \times \color{green}(2^{-3} + 2^{-4} + 2^{-4} \times \color{blue}(\frac{1}{5} ) \color{black}) \\ \color{black}&= 2^{-3} + 2^{-4} + 2^{-7}+ 2^{-8} + 2^{-11} + 2^{-12} + 2^{-12} \times \color{blue}(\frac{1}{5} ) \\ &=... \end{aligned} \end{equation} $$ A chaque étape, il restera toujours la fraction \(\frac{1}{5}\)En ce qui concerne les nombres décimaux, en informatique nous pouvons avoir deux approches: