Représentation machine des nombres¶
Nombres entiers¶
types et taille mémoire¶
en java : byte, short, int, long
en C: short int, int, long int, unsigned short, unsigned int, unsigned long
nombres positifs, problème du dépassement¶
exemple de l’octet, dépassement de capacité pour 191+81
nombres négatifs¶
Sur \(2n\) bits. Exemple de l’octet.
- bit de signe
- valeurs représentées de \(-(2^{n-1}-1)\) à \(2^{n-1}-1\), deux zéros.
- opposé facile
- besoin d’algorithmes distincts pour l’addition et la soustraction
- complément à 2
- valeurs représentées de \(-2^{n-1}\) à \(2^{n-1}-1\)
- opposé assez facile
- un seul algorithme d’addition
Calcul du complément à 2¶
- via la définition
- technique de calcul de l’opposé
Arithmétique du complément à 2¶
- Si le résultat est représentable, l’addition habituelle fonctionne si l’on jette la dernière retenue.
- Sinon, on a un dépassement de capacité, le résultat est valide modulo \(2^n\). Il faudrait passer à un type plus grand.
Big endian, little endian¶
problème de l’ordre de lecture des bits et des octets :
- convention du grand bout, correspond à notre écriture habituelle : Motorola, Sparc
- convention du petit bout, on commence par les unités : Intel.
Surtout vrai pour l’ordre des octets dans un int ou un long. En little endian, tout est un peu mélangé (mais l’avantage est que la conversion ne décale pas les octets).
Nombres flottants¶
Norme IEE 754¶
On utilise la représentation en virgule flottante
type | taille | signe | mantisse | exposant |
---|---|---|---|---|
float | 32 bits | 1 | 23 | 8 |
double | 64 bits | 1 | 52 | 11 |
On écrit un nombre flottant sous forme binaire normalisée
où \(a\) est un nombre flottant à virgule fixe dans \([1,2[\), et l’exposant \(e\) est positif ou négatif.
exemple avec \(x=13.2890625\).
la représentation de \(x\) pour chaque champ :
- bit de signe : 0 pour un nombre positif ou 0, 1 pour les négatifs
- mantisse : on représente les chiffres à droite du point dans l’écriture normalisée (à gauche c’est un 1, dont en binaire on ne perd rien à l’oublier).
- exposant : on représente l’entier positif \(e+s\), où \(s\) est l’excès qui vaut \(127\) pour un float et \(1023\) pour un double.
Les exposants extrêmes sont réservés à quelques valeurs particulières :
- \(0_+`s et :math:`0_-\) quand mantisse et exposant sont nuls
- \(\infty_+\), \(\infty_-\) quand l’exposant est \(111..1\) et la mantisse \(000..0\).
Toute autre valeur nulle ou maximale de l’exposant avec des mantisses non
nulles sont interdites et renvoient NaN
, «not a number».
Remarque: la norme fixe surtout le comportement des opérations, en particulier les arrondis effectués.
Problèmes¶
certaines valeurs ne sont pas représentables, qui peuvent être des résultats intermédiaires. L’égalité entre flottants n’a pas grand sens.
perte d’information
- par absorption : une petite valeur disparaît lorsqu’on l’ajoute à une autre plus grande
- par élimination : lors de la soustraction de deux valeurs proches on perd beaucoup d’information
De ce fait l’addition entre flottants n’est pas commutative.
attention à la propagation d’erreurs d’arrondi.