Outils pour utilisateurs

Outils du site


nsi:premiere:numeration

Ceci est une ancienne révision du document !



Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149

Warning: Trying to access array offset on value of type null in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149

Warning: Trying to access array offset on value of type null in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 149

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Numération

Il y a 10 sortes de gens, celles qui comprennent le binaire et les autres.

Fiche de cours à imprimerFiche d'exercices à imprimer

Du point de vue des mathématiques, les nombres $14$, $\frac{28}{2}$, $\sqrt{196}$, $1110_b$ sont tous identiques et on pourra raisonner indépendamment de la façon dont on choisit de les écrire. Toutefois, l'écriture choisie a son importance car certaines écritures sont plus commodes que d'autres.

L'informaticien a le même genre de problème : Il doit décider comment il écrira les nombres dans la machine et les choix qu'il fera auront une importance sur les calculs qu'il peut faire.

La technologie d'aujourd'hui repose sur des quantités tout ou rien, ce que l'on traduire par 1 ou 0. Il est alors naturel que les nombres utilisent l'écriture binaire qui n'a besoin que des symboles 1 et 0.

Les seules bases importantes pour nous seront

  • le décimal, base 10, base usuelle pour les humains,
  • le binaire, base 2, base naturelle pour les machines
  • l'hexadécimal, base 16, utile parce qu'elle résume l'écriture binaire et facilite ainsi le travail de l'humain.

Des symboles supplémentaires pour la base 16

On connaît les 10 symboles 0, … 9 de la base 10. Quand on utilise une base plus petite, on a intérêt à utiliser les mêmes symboles. Par exemple, en binaire, on utilise 0 et 1.

Mais quand la base est plus grande, que faire ? En base 16, il nous faut 16 symboles.

On choisit de compléter par les lettres A, B, C, D, E, F.

On a donc la correspondance A = 10, B = 11, C = 12, D = 13, E = 14 et F = 15

Notion de paquets

Exercice 1 et 1 bis de la fiche d'exercices.

Le principe de notre notation des nombres repose sur :

  1. l'utilisation de symbole élémentaires correspondant à une quantité connue,
  2. un principe de paquet

Exemple de la base 10

Par exemple, en décimal on utilise 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 et les paquets sont des paquets de 10.

Sur la figure ci-dessous, vous voyez à gauche les paquets possibles : une unité seule, un paquet de 10 (entouré en noir) et un paquet de 10 paquets de 10, c'est à dire un paquet de 100 (entouré en bleu).

Sur la droite, une quantité indéterminée d'items a été triée en paquets.

On constate que l'on a 2 paquets bleus, 1 noir et 3 unités. Dans ce cas on fait intuitivement le calcul et on déduit qu'il y a en tout 213 unités.

Exemple de la base 4

On reproduit l'expérience mais en envisageant maintenant des paquets de 4 : les paquets noirs contiennent 4 unités, les paquets bleus contiennent 4 paquets noirs et les paquets rouges contiennent 4 paquets bleus, comme on le voit sur la gauche.

Sur la droite le nouveau découpage montre que nous avons maintenant 3 rouges, 1 bleu, 1 noir et 1 unité.

Notez que la forme du paquet n'a pas d'importance. Le 3e paquet rouge n'est pas carré. L'important est qu'il contient 4x4x4 unités.

Numérotation de position

Exercice 2 de la fiche d'exercices.

Exemple de la base 10

Dans l'exemple précédent, on pourrait convenir d'utiliser toujours les mêmes couleurs de sorte que le premier nombre (base 10) serait 213 ou bien 132, la couleur permettant de savoir ce que signifie le 2, le 3 et le 1.

Mais c'est peu pratique. À la place on décide d'attribuer une signification à la position du chiffre dans le nombre :

  • On écrit les paquets dans l'ordre, du plus grand au plus petit : 213
  • La position donnant l'information nécessaire, on peut supprimer les couleurs : 213
  • le chiffre à droite représente toujours les unités : 3 unités.
  • Comme nous sommes en décimal, le poids d'une colonne est multiplié par 10 chaque fois qu'on avance d'une colonne à gauche.

Donc ici nous avons 3 unités (colonne de droite) plus 1×10 (2e colonne à partir de la droite) plus 2x10x10. Donc 213 = 2x10x10 + 1×10 + 3×1.

Cela à l'air un peu idiot comme cela. C'est que l'on est habitué à manipuler la base 10. Mettre ces mécanismes en évidence permet de mieux comprendre le fonctionnement des autres bases.

Exemple de la base 4

En base 4 nous avions le nombre 3111 que l'on notera sans couleur 3111. De droite à gauche :

  • le 1 à droite est une simple unité : 1×1,
  • le 1 suivant pèse 4 unités : 1×4,
  • le 1 suivant pèse 4×4 unités : 1x4x4,
  • le 3 final pèse 4x4x4 unités : 3x4x4x4

Le nombre est donc égal à 3x4x4x4 + 1x4x4 + 1×4 + 1×1 = 213.

Remarquez que nous ne savons faire ce calcul qu'en base 10. Le calcul 3x4x4x4 + 1x4x4 + 1×4 + 1×1 = 213 est donc un calcul fait un base 10 et le résultat correspond à ce que nous avions trouvé avec la base 10.

Indiquer la base

Le même nombre est noté 213 en base 10 et 3111 en base 4. Je ne peux pourtant pas écrire 213 = 3111. On convient alors d'indiquer la base en indice : $3111_4$.

On note la base en indice : $3111_4$ est en base 4, $213_{10}$ en décimal.

La base 10 étant notre base « normale », on convient qu'en l'absence d'indication, c'est la base 10 par défaut.

La base 2 et la base 16 ont une importance particulière et bénéficie d'une notation spéciale.

  • Pour le binaire, on peut mettre un 2 en indice – exemple : $1101001_2$ – mais on préfère souvent les deux notations suivantes : $1101001_\text{b}$ ou 0b1101001.
  • Pour l'hexadécimal, on peut mettre un 16 en indice – exemple : $3A4_{16}$ – mais on préfère souvent les deux notations suivantes : $3\text{A}4_\text{x}$ ou 0x3A4.

Ces notations supplémentaires sont utilisables en Python :

>>> 0b11101
45
>>> 0x3e
52

Conversion vers décimal

binaire vers décimal

Exemple de conversion : 0b101001 = 41.

Exercice 3 de la fiche d'exercices.

hexadécimal vers décimal

Exemple de conversion 0x2B3 = 691

Exercice 4 de la fiche d'exercices.

Conversion directe en Python

Comme on l'a dit, on peut, dans un programme, écrire un nombre binaire ou hexadécimal. Par exemple :

>>> 0b101001
41
>>> 0x2B3
691

Mais comment faire depuis un texte ? En effet, il est courant de devoir récupérer un nombre depuis une chaîne de texte : soit parce que le nombre provient d'un fichier texte, soit parce que le nombre provient de input.

Si j'ai un texte en décimal "497" et que je souhaite le transformer entier, c'est simple, il suffit de transtyper avec int :

>>> int("497")
497

Mais si le texte est un nombre en binaire ? Eh bien c'est simple aussi : il suffit de préciser la base :

>>> int("101001", 2)
41

Conversion depuis le décimal : divisions successives

Exemple : Conversion de 201 en binaire. On divise successivement par 2.

On parle de divisions entières, avec reste.
  • 201 divisé par 2 : 100 reste 1
  • 100 divisé par 2 : 50 reste 0
  • 50 divisé par 2 : 25 reste 0
  • 25 divisé par 2 : 12 reste 1
  • 12 divisé par 2 : 6 reste 0
  • 6 divisé par 2 : 3 reste 0
  • 3 divisé par 2 : 1 reste 1
  • 1 divisé par 2 : 0 reste 1

Quand le résultat de la division est 0, on s'arrête et on prend les restes en sens inverse.

201 = 0b11001001

Exercice 5 de la fiche d'exercices.

Affichage de la conversion avec Python

Par défaut, Python affiche les entiers sous forme décimale. Mais on peut lui demander un affichage dans une autre base en faisant une conversion en chaîne de caractère. Il faut pour cela utiliser un formatage.

Avec format

>>> "Le nombre est {}".format(497)
'Le nombre est 497'
>>> "Le nombre est {:b}".format(497)
'Le nombre est 111110001'
>>> "Le nombre est {:012b}".format(497)
'Le nombre est 000111110001'
>>> "Le nombre est {:x}".format(497)
'Le nombre est 1f1'
  • En ligne 1 un formatage de base. Le contenu de format est inscrit dans les {}. Comme on n'a rien précisé entre les {}, on se contente de transformer le 497 en texte, donc en décimal.
  • En ligne 3, on précise {:b}, ce sera donc du binaire.
  • En ligne 5, {:012b} indique que l'on veut du binaire avec 12 chiffres complétés à gauche par des 0 si besoin.
  • En ligne 7, {:x} indique que l'on veut de l'hexadécimal.

Les options de formatage sont nombreuses et puissantes.

Avec une f-string

Seulement à partir de Python 3.5

C'est la même chose mais en plus confortable : au lieu d'écrire .format après la chaîne, on place un f avant la chaîne. Les commandes précédentes deviennent :

>>> f"Le nombre est {497}"
'Le nombre est 497'
>>> f"Le nombre est {497:b}"
'Le nombre est 111110001'
>>> f"Le nombre est {497:012b}"
'Le nombre est 000111110001'
>>> f"Le nombre est {497:x}"
'Le nombre est 1f1'
J'ai utilisé 497 comme exemple, mais on pourrait mettre partout le nom d'une variable contenant un entier.
>>> a = 442 * 3
>>> f"Le résultat en hexa est {a:x}"
'Le résultat en hexa est 52e'

Conversion binaire - hexadécimal

Pourquoi utiliser l'hexadécimal ? Il n'est pas utile pour la machine qui ne comprend que le binaire et il ne semble pas utile pour nous qui préférons les décimal…

Le fait que $16 = 2^4$ (alors que 10 n'est pas une puissance de 2) fait que la conversion binaire ↔ hexadécimal est très simple. De plus, un nombre écrit en hexadécimal sera beaucoup plus court et simple à manipuler pour un humain. L'hexadécimal est une manière commode, pour l'humain, de manipuler des nombres binaires.

Exercice 9 de la fiche d'exercices.

Pour passer de l'hexadécimal au binaire ou réciproquement, ne passez pas par le décimal ! Cela irait à l'encontre de ce qui fait l'intérêt de l'hexadécimal. La conversion doit se faire de tête, rapidement, sans calcul.

Ci-dessus, l'exemple de 0b10110001101001. On regroupe les chiffres par 4 en partant de la droite. On ajoute des 0 à gauche au besoin. Chaque bloc de 4 correspond à un symbole hexadécimal.

Par exemple, $1100_b = 12 = C_x$.

Dans l'exemple, 0b10110001101001 = 0x2C69 et il n'est pas utile de savoir ce que cela vaut en décimal !

Occupation mémoire

Le plus petit élément de mémoire dans une machine est un chiffre binaire : le binary element, le bit.

Il faut plusieurs chiffres pour former des nombres. On regroupe donc les bits pour former des mots binaires.

On préfère parler de mot binaire que de nombre binaire. En effet, ces groupes de bits peuvent représenter des choses très diverses et ils ne correspondent pas forcément à des nombres. Dans une machine, les images, les textes, les sons… tout est représenté en binaire.

Byte et octet

En 1956, Werner Buchholz désigne le mot binaire par une « bouchée », soit bite en anglais. Ce mot étant trop proche de bit, il le déforme en Byte. Le Byte ne contenait pas forcément 8 bits à l'époque. L'usage s'est répandu d'utiliser des mots de 8 bits si bien que petit à petit, Byte est devenu synonyme d' octet.

La technologie a fait de l'octet la mesure de base. Aujourd'hui encore le chiffre 8 revient beaucoup. Par exemple les consoles de jeux de 3e génération vers 1983 étaient en 8 bits – NES, Sega Master System, Atari 7800. Cela signifie qu'à chaque lecture de la mémoire, on obtenait un mot de 8 bits, un octet.

Puis mes console de 4e génération vers 2000 étaient en 16 bits – Super NES, Méga Drive…

Ensuite à la 5e génération, on passe à 32 et 64 bits – Nintendo 64, Playstation…

Exercice 8 de la fiche d'exercices

En Python, les entiers, int occupent 4 octets. Ils pourraient donc aller en principe de 0 à $2^{32}-1$. Mais la représentation des nombres entiers n'est pas en binaire naturel. En effet, il faut pouvoir représenter le symbole – pour les nombres négatifs ! Donc les entiers pourront aller de $-2^{31}$ à $2^{31}-1$ – cf. cours sur les entiers négatifs.

Mais Python étant un langage très confortable, si on fait un calcul nécessitant des entiers plus grands, il passe automatiquement dans un format d'entiers de taille arbitraire qui utilise autant d'octets que nécessaire. Le calcul s'en trouve ralenti, il ne faut donc pas en abuser, mais c'est très pratique pour certains calculs mathématiques !

>>> 2**100
1267650600228229401496703205376

Unités de capacité mémoire

En informatique, on aime utiliser les puissances de 2 et on sait que $2^{10} = 1024 \simeq 1000$ ce qui a amené des confusions.

Les organismes de normes on donc défini en 1998 :

  • le kilo-octet : $1 \text{ko} = 1000$ octets
    le kibi-octet : $1 \text{kio} = 1024$ octets,
  • le Méga-octet : $1 \text{Mo} = 1000 \times 1000$ octets
    le Mébi-octet : $1 \text{Mio} = 1024 \times 1024$ octets.

La confusion perdure néanmoins et on peut parfois lire Ko à la place de kio .

L'usage est également de noter B pour Byte et b pour bit. Il ne faut donc pas confondre kB et kb.

Enfin, il faut utiliser k pour kilo, même si on voit souvent écrit K à la place.

Exercice 10 de la fiche d'exercices.

nsi/premiere/numeration.1627030751.txt.gz · Dernière modification : de goupillwiki