Codage des nombres à virgule
✎ Travail n° 1 Virgule fixe
-
Se référer à Virgule fixe puis donner “de tête” la représentation en virgule fixe des nombres suivants avec le format indiqué :
Rappel2-1 = 0.5
2-2 = 0.25
2-3 = 0.125
2-4= 0.0625
Valeur à convertir en virgule fixe
Nb bits partie entière
Nb bits partie décimale
5.5
3
1
18.75
5
2
4.125
3
3
29.25
5
3
12.5625
4
4
Solution
-
5.5 ⇒ 101.1|2
-
18.75 ⇒ 10010.11|2
-
4.125 ⇒ 100.001|2
-
29.25 ⇒ 11101.010|2
-
12.5625 ⇒ 1100.1001|2
-
-
Utiliser la méthode des multiplications successives pour donner la représentation en virgule fixe des nombres réels suivants en utilisant 7 bits pour coder la partie décimale :
-
3.9375
-
7.21875
-
10.6953125
Solution
-
3.9375 ⇒ 11.1111000|2
Partie entière :3 => 11|2
Partie décimale :2 * 0.9375 = 1.875 + 2 * 0.875 = 1.75 + 2 * 0.75 = 1.50 + 2 * 0.50 = 1
…puis on complète par 3 zéros pour avoir 7 bits
-
7.21875 ⇒ 111.0011100|2
Partie entière :7 => 111|2
Partie décimale :2 * 0.21875 = 0.4375 + 2 * 0.4375 = 0.875 + 2 * 0.875 = 1.75 + 2 * 0.75 = 1.50 + 2 * 0.50 = 1
…puis on complète par 2 zéros pour avoir 7 bits
-
10.6953125 ⇒ 1010.1011001|2
Partie entière :10 => 1010|2
Partie décimale :2 * 0.6953125 = 1.390625 + 2 * 0.390625 = 0.78125 + 2 * 0.78125 = 1.5625 + 2 * 0.5625 = 1.125 + 2 * 0.125 = 0.250 + 2 * 0.250 = 0.50 + 2 * 0.50 = 1
Inutile de compléter avec des zéros cette fois car la partie décimale est codée sur 7 bits
-
-
Quelle sera l’erreur sur la valeur obtenue si on décide de coder le nombre 3.14 en virgule fixe avec 5 bits pour la partie décimale ?
Solution
L’erreur sera de -0.015.
En effet , si on essaye de coder 3.14 avec la méthode des multiplications successives, on parvient à :
3.14 ⇒ 11.0010001111010111000010…|2 (suite infinie de bits après la virgule)
Si on se limite à 5 bits pour la partie décimale (→ 11.00100|2), la valeur réelle correspondante est :
Puissances de 2
21
20
2-1
2-2
2-3
2-4
2-5
Écriture binaire
1
1
,
0
0
1
0
0
⇒ 1011101|2 = 1 x 22 + 1 x 20 + 0 x 2-1 + 0 x 2-2 + 1 x 2-3 + 0 x 2-4 + 0 x 2-5 = 2 + 1 + 0 + 0 + 0.125 + 0 + 0 = 3.125
Donc, l’erreur de codage est bien de : 3.125 - 3.14 = -0.015.
✎ Travail n° 2 Virgule flottante
-
En utilisant le convertisseur en ligne Online Binary-Decimal Converter
déterminer parmi les valeurs suivantes celles qui peuvent être codées exactement en représentation IEEE754 (c-à-d pas par une valeur approchée) :
-
7
-
0.1
-
-1.5
-
26.65625
-
1,602176634 10−19 (charge électrique d’un électron en Coulomb ou A.s)
-
2.8352689733632 1014
-
-
En utilisant le même convertisseur en ligne, déterminer parmi les représentations IEEE754 suivantes lesquelles correspondent à des valeurs de nombre réels ?
-
01010101010101010101010101010101
-
01111111100000000000000000000000
-
10000000011111111111111111111111
-
11111111100000000000000000000000
-
01111111110000000000000000000000
-
00111111111000000000000000000000
-
00000000000000000000000000000000
-
-
Quelle sera l’erreur sur la valeur obtenue si on décide de coder le nombre 3.14 en virgule flottante (simple précision) ? Comparer cette erreur avec la valeur obtenue dans le travail précédent avec la représentation en virgule fixe.
-
Ci-dessous figure un script Python [1] qui met en œuvre 2 fonctions :
-
floatToBinary64()
: donne la représentation IEEE754 double précision (→ 64 bits) d’un nombre réel -
binaryToFloat()
: donne la valeur d’un nombre réel à partir d’une chaîne donnant sa représentation IEEE754 en double précisionScript Python
ieee754.py# Attention : En Python, les nombres réels sont représentés en IEEE754 # dooble précision (64bits) et non en simple précision (32 bits) import struct # Conversion réel -> IEEE754 def floatToBinary64(value): val = struct.unpack('Q', struct.pack('d', value))[0] if (val > 0) : return str(bin(val))[2:] else : return "-" + str(bin(val))[3:] # Conversion IEEE754 -> réel def binaryToFloat(value): hx = hex(int(value, 2)) return struct.unpack("d", struct.pack("q", int(hx, 16)))[0] # Représentation IEEE754 double précision d'un nombre réel realNb = 3.0 binstr = floatToBinary64(realNb) print('Représentation IEEE754 double précision de ' + str(realNb) + ' : ') print(binstr + '\n') # Valeur correspondant à un codage IEEE754 double précision fl = binaryToFloat(binstr) print('Valeur ' + binstr + ' : ') print(fl)
-
Tester le script sur quelques valeurs numériques pour s’assurer qu’il donne les mêmes résultats que le convertisseur en ligne Online Binary-Decimal Converter
-
Modifier le script de façon à demander à l’utilisateur de saisir le nombre à convertir plutôt que de le définir “en dur” dans le script
-
La fonction Python permettant la saisie d’une chaîne de caractères depuis la console s’appelle
input()
. -
Ne pas oublier de convertir chaine saisie en nombre réel (→
double(<chaine-saisie>)
) avant d’appeler la fonctionbinaryToFloat()
-
-
Se renseigner sur les fonctions Python
pack()
etunpack()
et expliquer le code des lignes 7 et 16Ces 2 fonctions sont très utiles dès lors que l’on veut interpréter des flux d’octets provenant d’une liaison série, du réseau, d’une base de données…
-
-
🞄 🞄 🞄