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é : Rappel 2-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écision Script 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 fonction binaryToFloat() Se renseigner sur les fonctions Python pack() et unpack() et expliquer le code des lignes 7 et 16 Ces 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… 1. credits : Converting between binary and decimal representations of IEEE 754 floating-point numbers in C++ 🞄 🞄 🞄 Codage des entiers relatifs Opérations bit à bit