Cours 2 : Représentation des nombres réels Représentation des nombres & Conséquences Cours 2 : Représentation des nombres réels & Conséquences A la fin de ce cours, vous devez être capable de : - coder un réel en simple ou double précision, - décrire les limites de la représentation des réels sur n bits. Codage de 09,2015 en double précision
1 Représentation de la partie décimale d’un nombre En notation décimale, les chiffres à gauche de la virgule représentent des entiers, des dizaines, des centaines …, ceux à droite de la virgule, des dixièmes, des centièmes, des millièmes… 3,14510 = 3 . 100 + 1 . 10-1 + 4 .10-2 + 5 . 10-3 Le codage de la partie entière (3 dans l’exemple précédent) ne pose pas de problèmes particuliers (voir cours précédent). Pour la partie décimale 0,145, il est nécessaire d’adapter la procédure.
1 Représentation de la partie décimale d’un nombre Codage de la partie décimale L’expression de la partie décimale dans une nouvelle base B est obtenue par multiplication successive par B de la partie décimale du résultat précédent, l’unité obtenue correspond à un élément de la décomposition. On procède ainsi de suite jusqu’à ce qu’il n’y ait plus de partie décimale ou que le nombre de bits obtenus corresponde à la taille du mot mémoire dans lequel on stocke cette partie. Méthode 2 Méthode 1 Exemple : passage de 0,145 en base 2 + Pratique !! - imposer le nombre n de chiffres significatifs souhaités, - multiplier la partie décimale par Bn, puis coder le résultat de la partie entière. 0,145 × 2=0,29 0,29 × 2=0,58 0,58 × 2=1,16 0,16 × 2=0,32 0,32 × 2=0,64 Exemple : codage de 0,145 sur 8 bits : 0,145 × 28 ≈ 37,12 or (37)10 = (00100101)2 donc 0,145 ≈ (0,00100101)2 0,64 × 2=1,28 ... ≈ donc 0,145 = (0,001001)2
1 Représentation de la partie décimale d’un nombre Codage de la partie décimale Remarque : la décomposition de la partie décimale peut conduire à une suite infinie de termes. Par exemple 0,3 0,3 × 2= 0,6 0,6 × 2= 1,2 0,2 × 2= 0,4 0,4 × 2= 0,8 On écrira donc 0,3 ≈ (0,01001 1001)2 0,8 × 2= 1,6 0,6 × 2= 1,2 ... Remarque : le codage sur un nombre n de bits fixes implique un nombre fini de valeurs. Les calculs seront nécessairement arrondis et comporteront des erreurs d’arrondi et de précision.
1 Représentation de la partie décimale d’un nombre Nous avons vu comment écrire un réel dans n’importe quelle base et notamment la base 2. En plus des erreurs d’arrondi, le problème est que cette écriture ne peut être utilisée dans un ordinateur en raison de la présence la virgule. De plus, cette méthode ne permet pas de représenter des nombres très grands ou très petits comme le nombre d’Avogadro NA = 6,0221413.. x 1023 mol-1 la constante de Planck h = 6,62606957 x 10-34 J.s Pour remédier à ce problème, la notation scientifique pour les nombres est adoptée. Le principe du codage des réels en mémoire est basé sur cette représentation dite à virgule flottante (float). (11,00100101)2 se mettra sous la forme 1,100100101 x 21
termes après la virgule, 1 Représentation de la partie décimale d’un nombre (11,00100101)2 Représentation dite à virgule flottante (float) se mettra sous la forme Tout nombre sera ainsi représenté par : +1,100100101 x 21 son signe, ici +, sa mantisse réduite termes après la virgule, ici 100100101 son exposant, ici 1 norme IEEE 754 – Institute of Electrical and Electronics Engineers
Les exposants peuvent ainsi aller de -126 à +127 en simple précision. 2 Représentation d’un nombre réel NORME IEEE 754 (virgule flottante) – type float Codage d’un nombre réel selon la norme IEEE En simple précision, cette norme se propose de coder le nombre sur 32 bits et définit trois composantes : - le signe est représenté par un seul bit, bit de poids fort 0 si positif, 1 si négatif - l'exposant est codé sur les 8 bits consécutifs au signe, - la mantisse (dite réduite car seuls les bits situés après la virgule sont retenus) sur les 23 bits restants. Important - l'exposant 00000000 est réservé pour 0 et nombres dénormalisés (nombre très petits d’exposants incodables), Conversion par excès Les exposants peuvent ainsi aller de -126 à +127 en simple précision. - l'exposant 11111111 est réservé ∞ et nombre NaN - pour prendre en compte les exposants négatifs, on rajoute 127 soit (01111111)2 à l'exposant
2 Représentation d’un nombre réel NORME IEEE 754 (virgule flottante) – type float Formule d'expression des nombres réels (-1)S x 2(E - 127) x ( 1 + M ) S est le bit de signe (avec -10 = 1), E est l'exposant codé auquel on doit bien soustraire 127 pour obtenir l’exposant réel, M est la mantisse correspondant à la partie fractionnaire et qui est ajoutée à 1 pour effectuer le calcul Formule d'expression des nombres réels dénormalisés (-1)S x 2(E - 127+1) x ( M )
2 Représentation d’un nombre réel NORME IEEE 754 (virgule flottante) – type float Exemple avec un réel positif coder 525,5 en simple précision sa représentation en base 2 est : 1000001101,1 La représentation du nombre 525,5 en binaire avec la norme IEEE 754 en normalisant, on trouve : 1,0000011011 x 29 0 1000 1000 00000110110000000000000 en regroupant les quartets : 0100 0100 0000 0011 0110 0000 0000 0000 ajout de 127 à l'exposant qui vaut 9 ce qui donne 136, soit en base 2 : 10001000 La mantisse est composée de la partie décimale de 525,5 en base 2 normalisée, c'est-à-dire 0000011011 ou 0x44036000 en hexadécimal codée sur 23 bits, il est nécessaire d'ajouter des zéros pour la compléter : 00000110110000000000000
Exemple avec un réel négatif 2 Représentation d’un nombre réel NORME IEEE 754 (virgule flottante) – type float Exemple avec un réel négatif coder -0,625 en simple précision sa représentation en base 2 est : 0,101 La représentation du nombre -0,625 en binaire avec la norme IEEE en normalisant, on trouve : 1,01 x 2-1 1 0111 1110 01000000000000000000000 en regroupant les quartets : 1011 1111 0010 0000 0000 0000 0000 0000 ajout de 127 à l'exposant qui vaut -1 ce qui donne 126, soit en base 2 : 01111110 La mantisse sur 23 bits est 01000000000000000000000 ou 0xBF200000 en hexadécimal
2 Représentation d’un nombre réel NORME IEEE 754 (virgule flottante) – type float nombre d’Avogadro : NA = 6,0221413.. x 1023 mol-1 constante de Planck : h = 6,62606957 x 10-34 J.s Pratique !!! http://www.binaryconvert.com/convert_float.html
2 Représentation d’un nombre réel NORME IEEE 754 (virgule flottante) – type float Notions sur les précisions des formats de codage Sur 32 bits - simple précision le plus petit écart entre deux nombres, supérieurs à 1, est de 2−23 ≈ 1,2 × 10−7, le chiffre suivant immédiatement 1 est 1,000 000 119 209 29. Entre les deux, il n’y a rien... le plus petit nombre est ± 2−126-23 ≈ ± 1,40129 × 10−45, le plus grand nombre est ± 1,11111111111111111111111 × 2127 ≈ ± 3,4 × 1038. décalage égal à 211−1 − 1 = 1023 Sur 64 bits – double précision le plus petit écart entre deux nombres, supérieurs à 1, est de 2−52 ≈ 2,2 × 10−16, Temps de calcul plus long espace de stockage plus important le plus petit nombre est ± 2−1022-52 ≈ ± 4,94065 × 10−324, le plus grand nombre est ±1.11111111111111111... × 21023 ≈ ±1,8 × 10308.
3 Opérations Pour réaliser les opérations sur la représentation des nombres réels, il faut : Pour une addition / soustraction : effectuer l’opération sur les mantisses en pensant à décaler les représentations du nombre nécessaire de bits pour prendre en compte les exposants différents, modifier le résultat pour être sous la bonne forme. Pour une multiplication / division : réaliser l’opération multiplication ou division sur les mantisses et définir la nouvelle mantisse car le résultat peut être supérieur à 2 ou inférieur à 1, additionner (pour la multiplication) ou soustraire (pour la division) les exposants. et dans tous les cas, vérifier le non dépassement de capacité.
Les erreurs d’arrondis font perdre l’associativité à l’addition 3 Opérations Une des conséquences de la limitation de la représentation est que les opérations ne sont plus associatives. Explication : supposons pour simplifier que les réels soient stockés avec 3 chiffres significatifs et arrondis au plus proche >>> a=1.23 >>> b=4.56 >>> c=7.89 >>> (a+b)*c==a*c+b*c False Prenons x = 8,22 = 0,822.10 y = 0,00317 = 0,317.10-2 z = 0,00432 = 0,432.10-2 On veut calculer la somme x + y + z (x + y) + z donne x + y = 8,22317 ≈ 0,822.10 (x + y) + z ≈ 8,22432 ≈ 0,822.10 Les erreurs d’arrondis font perdre l’associativité à l’addition x + (y + z) donne y + z = 0,00749 ≈ 0,749.10-2 x + (y + z) ≈ 8,22749 ≈ 0,823.10 Exercice : effectuer l’addition de 0,75 avec 0,85 en représentation flottante sur 16 bits (signe codé sur 1 bit, exposant codé sur 5 bits avec décalage par excès de 15, mantisse réduite codée sur 10 bits) Commentaires …
3 Opérations Phénomène de compensation Lorsque l’on effectue des soustractions entre des nombres de valeurs très proches, il peut y avoir des pertes importantes de précisions Exemple : on veut résoudre x2 – 1634.x + 2 = 0 en effectuant les calculs avec 10 chiffres significatifs. On obtient En modifiant l’algorithme numérique utilisé, on peut compenser les effet d’arrondi Δ = 667487, √Δ≈ 816,9987760, x1 = 817 + √Δ = 1633,998776, x2 = 817 - √Δ = 0,0012240. On a donc une perte de 2 chiffres significatifs sur la valeur de x2 ! Pour compenser cette erreur d’arrondi, on peut remarquer que x1.x2 = 2, donc : x2 = 2 / x1 ≈ 0,001223991…
4 Notion de mode d’arrondi & Problèmes de précision , 4 Notion de mode d’arrondi & Problèmes de précision Malgré les capacités des ordinateurs, le codage des nombres réels nécessite l’utilisation d’arrondis. En effet tous les nombres réels ne pourront pas être codés exactement sur n bits. De plus, les nombres ne sont pas également espacés dans l’ensemble des nombres flottants représentables. positions des premiers nombres flottants sur l’axe des réels positifs norme IEEE 754, 4 modes d’arrondis : Soient et tels que et l’arrondi vers 0 l’arrondi au plus près on représente alors par ou en fonction de mode d’arrondi retenu l’arrondi vers l’arrondi vers
Pour les très petits nombres De plus, les nombres ne sont pas également espacés dans l’ensemble des nombres flottants représentables. http://www.binaryconvert.com/convert_float.html Pour les très petits nombres Écart de 1.40129846432481707092372958329.10-45 1.40129846432481707092372958329E-45 2.80259692864963414184745916658E-45 Pour les petits nombres Écart de 1,1920928955078125.10-7 1 1.00000011920928955078125
Pour les très petits nombres De plus, les nombres ne sont pas également espacés dans l’ensemble des nombres flottants représentables. http://www.binaryconvert.com/convert_float.html Pour les très petits nombres Écart de 1.40129846432481707092372958329.10-45 Pour les petits nombres Écart de 1,1920928955078125.10-7 Pour les grands nombres Écart de 0.000000256. 109 = 256 ! 3.0E9 3.000000256E9 Pour les très grands nombres Écart de 2.2824096…. 1031 !!! 1.70141183460469231731687303716E38 1.70141203742878835383357727663E38
4 Notion de mode d’arrondi & Problèmes de précision Remarque : cet arrondi s’effectue après chaque entrée de données et après chaque opération arithmétique élémentaire, si bien que les erreurs d’arrondis peuvent s’accumuler ! Tout résultat informatique est donc par codage entaché d’erreur, on a donc : avec ea l’erreur absolue 1,23456 – 1,23449 ≠ 7.10-5 mais 1,23456 – 1,23449 = 7,00000000000145.10-5 ! avec er l’erreur relative En simplifiant, on peut remarquer que : Test a == b ? Test expr == 0 ? les additions / soustractions ajoutent les erreurs absolues, les multiplications / divisions ajoutent les erreurs relatives, il peut y avoir de grandes erreurs même sur un petit nombre de calcul cancellation
4 Notion de mode d’arrondi & Problèmes de précision
5 Représentation d’autres informations 5.1 Caractères Un code binaire est associé à chaque caractère Il existe plusieurs codages : - ASCII (1961) qui définit 128 caractères et est codé sur 7 bits (voir tableau ci-dessous). Les ordinateurs travaillant sur des octets, des versions étendus ont été proposées,
5 Représentation d’autres informations 5.1 Caractères Un code binaire est associé à chaque caractère Il existe plusieurs codages : - ASCII (1961) qui définit 128 caractères et est codé sur 7 bits (voir tableau ci-dessous). Les ordinateurs travaillant sur des octets, des versions étendus ont été proposées, - ISO 8859 (1986) définit 15 jeux de 256 caractères codé sur 1 octet (voir tableau page suivante). Ce sont des extensions du code ASCII pour prendre en compte les caractères spéciaux des différentes langues,
5 Représentation d’autres informations 5.1 Caractères Un code binaire est associé à chaque caractère Il existe plusieurs codages : - ASCII (1961) qui définit 128 caractères et est codé sur 7 bits (voir tableau ci-dessous). Les ordinateurs travaillant sur des octets, des versions étendus ont été proposées, - ISO 8859 (1986) définit 15 jeux de 256 caractères codé sur 1 octet (voir tableau page suivante). Ce sont des extensions du code ASCII pour prendre en compte les caractères spéciaux des différentes langues, - Unicode (1991) et UTF8 (1993) définissent environ 245 000 caractères mais peuvent en contenir plus d’un million. Il n’y a plus de relation directe entre le codage d’un caractère et son espace mémoire. Suivant la version de la norme choisie le nombre de bits nécessaire à la représentation peut varier fortement.
analogique/numérique 5 Représentation d’autres informations 5.2 Signaux temporels Les signaux temporels ne peuvent être représentés que de façon discrète, Signal initial Discrétisation temporelle Codage des valeurs Chaque point peut être représenté sous la forme d’un entier ou d’un flottant codé et est stocké en mémoire dans un tableau. conversion analogique/numérique CAN
5 Représentation d’autres informations 5.3 Images (matricielles) Les images sont stockées et affichées sous forme d’un tableau (d’où le nom image matricielle) de pixels (« picture element ») colorés. On utilise aussi le terme de carte de point (« bitmap »). Le codage de chaque pixel peut être réalisé en : couleur RGB : composante R G B stockée sur 4, 8 ou 16 bits niveau de gris : 4, 8 ou 16 bits par pixel noir et blanc : 1 bit par pixel L’image est ensuite généralement compressée, ce qui donne les différents types de fichiers connus : bmp, raw, tiff, jpeg …