Vous êtes sur la page 1sur 22

représentation et codage de l’information

3. représentation des nombres à virgule

Pierre Réty
janvier-février 2021
L1 informatique — Université d’Orléans
Avec Python :

>>> 0.1 + 0.2


0.30000000000000004

>>> 0.1 + 0.0001 - 0.1


0.00010000000000000286

>>> 1.2 - 1.0


0.19999999999999996

>>> 1e54 + 1e-30


1e+54
Nombres à virgule fixe
Nombres décimaux

3,141 592 653

Une partie entière : 3


Une partie fractionnaire : 0,141 592 653

3+1×10−1 +4×10−2 +1×10−3 +5×10−4 +9×10−5 +2×10−6 +6×10−7 +5×10−8 +3×10−9

2
Nombres binaires fractionnaires

𝑑𝑛 𝑑𝑛−1 ⋯ 𝑑1 𝑑0 , 𝑑−1 𝑑−2 ⋯ 𝑑−𝑚

𝑛
𝑦 = ∑ 𝑑𝑖 × 2𝑖
𝑖=−𝑚

1
Exemple : 10,012 = 21 + 2−2 = 2 + 4
= 2,2510

3
Nombres binaires fractionnaires

Permet de représenter sur 𝑛 + 𝑚 bits (et 1 éventuel bit de


signe) les multiples de 1/2𝑚 jusqu’à 2𝑛 − 1/2𝑚 .

3,510 = 21 + 20 + 2−1 = 11,12

0,110 = (0,0 0011 0011 0011 ⋯)2

1/310 = (0, 333333 ⋯)10 = 0,13

L’arithmétique est essentiellement la même que sur les


entiers, éventuellement signés.

4
Nombres à virgule flottante
Motivation

Quelques propriétés attendues d’une bonne représentation


des nombres à virgules pour une arithmétique efficace :

• rapidité des calculs ;


• précision des calculs ;
• dynamique des valeurs représentées ;
• portabilité des calculs ;
• facilité d’utilisation.

5
Notation scientifique

𝑁𝐴 = 6,022 140 76 × 1023

Une notation qui permet de connaître l’ordre de grandeur des


nombres et d’effectuer facilement multiplications et divisions.

La notation rend compte de la précision avec laquelle la


valeur est connue.

La représentation en virgule flottante reprend ce principe.

6
Virgule flottante

Un nombre 𝑦 en virgule flottante, en base 𝐵, est donné par

• un bit de signe 𝑠 ; (𝑠 = 1 signifie négatif )


• un nombre 𝑚 en virgule fixe sur |𝑚| bits

• un exposant 𝑒′ ∈ {𝑒min , … , 𝑒′max }.

𝑠 𝑒′
𝑦 = (−1) × 𝑚 × 𝐵

7
À chacun sa cuisine

Avant la norme IEEE 754, chaque machine y allait de son choix :


système 𝐵 |𝑚| 𝑒min 𝑒′max
Cray 1 (single) 2 48 −8192 8191
Cray 1 (double) 2 96 −8192 8191
DEC VAX G 2 53 −1023 1023
DEC VAX D 2 56 −127 127
HP48G 10 12 −499 499

En 1985, avec la volonté de portabilité et d’homogénéiser les


représentations et les traitements arithmétiques, une
standardisation se met en place à travers la norme IEEE754.

8
IEEE754
IEEE754-2008

nom précision 𝐵 |𝑠| |𝑒| |𝑚| décalage 𝛿𝑒


binary16 demi 2 1 5 10 15
binary32 simple 2 1 8 23 127
binary64 double 2 1 11 52 1023
binary128 quadruple 2 1 15 112 16383

|𝑠|, |𝑒|, |𝑚| sont les tailles (nombre de bits) de 𝑠, 𝑒, 𝑚


L’exposant 𝑒′ est un entier signé représenté par décalage.
⟹ On calcule 𝑒 = 𝑒′ + 𝛿𝑒

Représentation machine usuelle gros-boutiste.

𝑠 𝑒 𝑚

9
Nombres normalisés

Lorsque 𝑒 ∉ {00 ⋯ 0, 11 ⋯ 1}.


L’exposant est représenté par décalage de 𝛿𝑒 = 2|𝑒|−1 − 1.
Et on utilise la valeur à virgule fixe 1,𝑚0 𝑚1 … 𝑚𝑝

Décodage : 𝑦 = (−1)𝑠 × 1,𝑚 × 2𝑒−𝛿𝑒

Problème : on ne peut pas coder 010

10
Exemple de codage

Codons en binary16 le nombre 5, 5.


5, 5 = 22 + 20 + 2−1 = 101, 12 = 1, 0112 × 22
(en base 2, multiplier par une puissance de 2 décale la virgule)

mantisse 𝑚 sur 10 bits (on ajoute des 0 à droite) :


0110000000
exposant 𝑒′ = 2 donc 𝑒 = 𝑒′ + 15 = 17, donc sur 5 bits 10001
signe 𝑠 positif 0

Représentation binary16 : 0 10001 0110000000


(en réalité il n’y a pas d’espaces pour séparer 𝑠, 𝑒, 𝑚)

Codé en hexadécimal : 458016

11
Exemple de décodage

Convertir en décimal le nombre représenté en binary16 et


codé en hexadécimal : 𝑐8𝑒0

𝑐8𝑒0 = 1100 1000 1110 0000 = 1 10010 0011100000 = 𝑠 𝑒 𝑚

Donc :
𝑠 = 1 : négatif
𝑒 = 100102 = 18. Donc 𝑒′ = 𝑒 − 15 = 3
𝑚 = 0011100000

On obtient (−1) × 1, 𝑚 × 2𝑒 = −1, 00111 × 23 = −1001, 11 =
−(23 + 20 + 2−1 + 2−2 ) = −(8 + 1 + 0, 5 + 0, 25) = −9, 75

12
Nombres sous-normalisés ou dénormalisés

Lorsque 𝑒 = 00 ⋯ 0.
On fait comme si 𝑒 était 110
et on utilise la valeur à virgule fixe 0,𝑚0 𝑚1 … 𝑚𝑝

Décodage : 𝑦 = (−1)𝑠 × 0,𝑚 × 21−𝛿𝑒

Remarque Il y a deux zéros +0 et −0.


En binary16, +0 est représenté par 0 00000 0000000000

13
Nombres spéciaux

Lorsque 𝑒 = 11 ⋯ 1.

Si la mantisse 𝑚 est nulle, le nombre représente ±∞.


Utilisé pour les dépassements de capacité.

Si la mantisse est non nulle, représente Not-a-Number (NaN).


Utilisé pour les opérations sans valeur numérique (√−1, 0/0, …)

14
Propriétés des flottants IEEE

La valeur zéro est codée à l’indentique en entier non signé et


en flottant.

La comparaison des flottants est très simple :

• comparer les bits de signe ;


• gérer la double représentation de zéro ;
• comparer comme des entiers non signés !

15
Arithmétique sur les flottants

Le principe est le même que pour le calcul à la main en


notation scientifique : multiplication facile, addition attention
au calage des exposants.

Le principe est d’effectuer les opérations arithmétiques de


manière exacte puis de les convertir en flottant :

• avec arrondi si la précision de la mantisse n’est pas


suffisante ;
• avec dépassement si l’exposant est trop important.

16
Notation scientifique des flottants

0x1c.8p-5

Reconduit la notation scientifique décimale (314.159e-2)


avec des puissances de 2 (notation p)
Le préfixe 0x indique que la mantisse est donnée en
hexadécimal.

Standardisé en programmation C en C99 et C++17.

17
Tragique erreur d’arrondi

Le 25 février 1991, pendant la guerre du Golfe, une batterie


d’ interception anti-aérienne Patriot ne parvient pas à
intercepter un Scud irakien : 28 soldats morts et 100 blessés.

Le système estime la position du missile à


partir de sa vitesse (environ 1676m/s) et du
temps écoulé.
Le temps écoulé depuis le démarrage du
système est mesuré par un nombre de cycles
d’horloge de 0,1𝑠.
L’erreur de représentation de 0,1 en flottant
simple précision est de 9,5 × 10−8 . Après 100h
d’accumulation l’erreur amplifiée est d’environ
0,34𝑠. Soit une erreur de position de presque
570𝑚. 18

Vous aimerez peut-être aussi