Cours Stage - Nombres flottants

Exercice - Codage en base deux en informatique

L'énoncé

Au cours de cet exercice, on suppose qu'un ordinateur code un nombre sur 32 bits : 

- Le bit de poids fort sert à coder le signe. On rappelle que 0 correspond à un nombre non négatif (positif ou nul) et 1 correspond à un nombre négatif.

- L'octet suivant sert à coder l'exposant.

- Les 23 derniers bits servent à coder la mantisse.


Question 1

Quel est le plus grand nombre flottant en base 2 que l'ordinateur puisse coder ?

Le plus grand nombre codé pour l'ordinateur serai composé uniquement de 1 sauf pour le bit de signe (on veut un signe positif), ainsi que le bit de signe de l'exposant pour que celui ci soit positif : 00111111111111111111111111111111

Cependant, en informatique et en base 2, le premier chiffre de la mantisse est forcément 1 donc il n'est pas pris en compte dans son écriture formalisée.

Le nombre devient donc $1,11111111111111111111111_{base\:2}\times 2^{1111111_{base\:2}}$

Ne pas oublier que l'exposant possède un signe et que le premier chiffre de la mantisse n'apparaît pas en base 2.

Question 2

L'ordinateur enregistre le nombre suivant, codé selon le principe décrit en énoncé : 0 00001010 10110110010000000000000

A quel nombre flottant correspond-il ?

Tout d'abord, le bit de poids fort montre que le nombre est positif. De plus, le premier chiffre de la mantisse est nécessairement un 1, il n'est donc pas écrit mais il ne faut pas l'oublier :

Le nombre correspond donc a : $1,10110110010000000000000_{base\:2}\times 2^{0001010_{base\:2} }=1,10110110010000000000000_{base\:2}\times 2^{10_{base\:{10}} }$

$=11011011001,0000000000000_{base\:2}\times 2^0=1753,0000000000000_{base\:{10}}$

L'objectif est de trouver en premier la puissance de 2 pour pouvoir ensuite décaler la virgule flottante. Ensuite, il suffit de traduire le nombre binaire en nombre décimal. 

Question 3

A quel nombre flottant correspond ce nombre : 0 10000010 10110000000000000000000 ?

Cette fois-ci, on remarque que l'exposant est négatif, on aura donc du $2^{-2}$

On a donc :

$1,10110000000000000000000_{base\:2}\times 2^{-2_{base\:{10}}}=0,0110110000000000000000000_{base\:2}\times 2^0=2^{-2}+2^{-3}+2^{-5}+2^{-6}=0,421875$

Question 4

En informatique, les fractions sont transformées automatiquement en nombre flottant avant toute opération. Quel problème cela peut-il poser ?

On peut essayer de prendre l'exemple de $\dfrac{1}{3}+\dfrac{1}{3}+\dfrac{1}{3}$

Comme on le sait bien, $\dfrac{1}{3}=0,3333...$ Ainsi, dans le cadre de notre modélisation, l'ordinateur possède 32 bits pour coder un nombre qui contient une infinité de chiffre. Il sera donc forcé de réaliser une approximation.

De plus, le passage au binaire impose que la troncature du $\dfrac{1}{3}$ ne soit pas forcément de la forme 0,3333333 avec un nombre fini de trois, mais risque de donner 0,3333333335986 par exemple.

Ainsi, on remarque que $\dfrac{1}{3}+\dfrac{1}{3}+\dfrac{1}{3}\not=1$

Question 5

Comment coder le nombre 0 avec le formalisme présenté en énoncé ?

En effet, on a vu qu'en réalité, la mantisse contient un 1 implicite. Ainsi, pour l'ordinateur 0 00000000 00000000000000000000000 correspond en réalité au nombre $1,00000000000000000000000\times 2^0=1$

Au vu des approximations vues à la question 4, une solution serait de considérer que 0 est le plus petit chiffre positif codable par l'ordinateur.

Le nombre 0 pourrait correspondre à 0 11111111 000000000000000000000000. Dans ce cas, on dis que $0=2^{-127}\simeq 5,9\times 10^{-39}$

Cependant, en réalité, l'ordinateur peut différencier les entiers des flottants. Ainsi, 0 entier ne pose pas de problème d'approximation.