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.

  1. 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
  2. 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

\[x = a\times 2^e\]

\(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.