Les nombres dans la machine

La representation des reels

Comment 64 bits suffisent (presque) a ranger n'importe quel nombre reel : le standard IEEE 754, en trois morceaux.

Les trois morceaux d'un float

En Python, un float occupe 64 bits (la « double precision »). Ces 64 bits sont decoupes en trois zones, comme la notation scientifique -1.5 × 10^8 que tu connais, mais en binaire :

Signe 1 bit
Exposant 11 bits
Mantisse (les chiffres) 52 bits

C'est pour ca qu'un nombre comme 0,1, infini en binaire, doit etre coupe a 52 bits : la valeur rangee est tres proche, mais pas exacte.

La formule qui relie le tout

A partir des trois zones, la valeur reelle se reconstruit ainsi :

valeur = (-1)^signe × 1,mantisse × 2^(exposant - 1023)

Le - 1023 (le « biais ») permet a l'exposant de representer aussi bien des nombres geants que minuscules. Le 1, devant la mantisse est implicite : on gagne un bit gratuit de precision.

Exemple : pour 0.5, le signe vaut 0, la mantisse est nulle, et l'exposant code 2^(-1)1,0 × 2^-1 = 0,5. Essaie-le dans la demo ci-dessous.

Demo : decompose un nombre en bits reels

Tape un nombre : la machine te montre les 64 bits exacts qu'elle utilise pour le ranger (calcul fait sur place, comme en Python).

Le decomposeur IEEE 754

L'epsilon machine : pourquoi ~15-16 chiffres

Avec 52 bits de mantisse, le plus petit ecart qu'on puisse ajouter a 1.0 sans qu'il « disparaisse » vaut environ 2,22 × 10^-16. C'est l'epsilon machine.

import sys sys.float_info.epsilon # 2.220446049250313e-16 # en dessous de l'epsilon, l'ajout est invisible : 1.0 + 1e-16 == 1.0 # True (!)

En clair : un float est fiable sur environ 15 a 16 chiffres significatifs. Au-dela, les chiffres ne veulent plus rien dire - c'est la limite physique du format.

Simple ou double precision ?

Le float64 n'est pas le seul format. En calcul scientifique (avec numpy), on choisit parfois le plus leger float32 pour gagner de la memoire et de la vitesse - au prix de la precision.

float32 (simple)float64 (double)
Total des bits3264
Exposant8 bits11 bits
Mantisse23 bits52 bits
Chiffres fiables~7~15-16
Plus grand~3,4 × 10^38~1,8 × 10^308

Python utilise toujours float64. C'est numpy qui ouvre le choix : np.float32(...) pour economiser, np.float64(...) par defaut.

Pour continuer

→ Maintenant que tu sais comment les bits codent un nombre, vois dans Little & big endian dans quel ordre les octets sont ranges.

→ Pour les consequences pratiques au quotidien : Les erreurs d'arrondi.