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 :
- Le signe : 1 bit.
0= positif,1= negatif. - L'exposant : 11 bits. Il place la virgule, comme le
10^8de la notation scientifique - mais en puissances de 2. - La mantisse : 52 bits. Ce sont les chiffres significatifs du nombre. Leur nombre fini est la cause de toutes les erreurs d'arrondi.
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.
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 bits | 32 | 64 |
| Exposant | 8 bits | 11 bits |
| Mantisse | 23 bits | 52 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.