Bonjour,
Comment font les banques ?
Les banques ne travaillent jamais en virgule flottante, car elles ne peuvent se permettre aucune erreur d’arrondi.
En plus elles manipulent tantôt des grands nombres (des milliards), tantôt des petits nombres (des opérations de trading au millionième de centime).
Quand les ordres de grandeurs sont potentiellement si différents, ça renforce d’autant plus les imprécisions au fur et à mesure des calculs.
Je sais que ce n’est pas un bug, mais pourquoi on crée des machines qui ne sont pas précises ?
Quel est le but si sa vocation n’est pas d’être précis ?
Comme déjà dit, ce n’est pas un bug, et le comportement est suffisant ou acceptable dans la plupart des cas.
En général, la précision est largement suffisante pour ce qu’on veut représenter.
Il faut bien voir qu’il existe une infinité de nombres réels. Or en informatique, les nombres sont stockés dans une quantité fixe de bits, typiquement 32 ou 64 bits.
Donc la plupart des nombres réels, fatalement, tu ne peux pas les écrire exactement. Il faut décider de ce que tu veux pouvoir représenter, et ce que tu peux accepter comme inexactitude.
IL existe bien sûr des bibliothèques qui permettent de faire du calcul rigoureusement exact. Elles utilisent un nombre variable adéquat de bits pour représenter les nombres, mais elles ne viennent pas sans inconvénient… notamment, elles sont beaucoup plus lentes.
Si tu veux toujours garder le maximum de précision, chaque opération fait potentiellement doubler le nombre de bits nécessaires pour représenter le résultat exactement (un nombre de n bits multiplié par un nombre de m bits occupera n+m bits). C’est très impactant à la longue.
Faisons une petite analogie avec le système décimal pour comprendre le compromis qui a été conçu dans la norme IEE-754, peut-être que tu comprendras mieux.
Admettons que tu n’est autorisé à écrire des nombres que sur 3 chiffres significatifs, sous la forme XXX * 10^Z
.
Dans le vocabulaire consacré, XXX est la mantisse, et Z l’exposant.
- 012 + 034 = 056, pas de problème
- 1,23 + 4,56 = 5,79, pas de problème non plus
- 999 + 1 = 1000 =
100 * 10^1
, on a le droit
- 1 / 4 = 0,25 (`110^0 / 4100 = 25*10-2), pas de problème, ça fonctionne
- 100 / 3 = 33,333333… qu’on va arrondir / couper à
333 * 10^-1
. Par contre en voulant faire 3 * 33,3
, on tombera sur 99,9 et pas 100, c’est le problème d’arrondi.
- 999 + 2 = 1001. ON peut écrire
100 * 10^1
, mais on a perdu le 1. C’est le phénomène d’absorption. Au-delà de 1000, on n’a seulement une précision de 10.
ON a le même phénomène avec 100 + 0,5, ou avec 1 + 0,0001.
- En prenant 200 / 3 arrondi à 66,7, c’est intéressant: remultipliés tels quels par 3, on arrive à 200,1, mais au final on retombe sur nos pieds à 200 car le 0,1 est au-delà des 3 chiffres significatifs (arrondi+absorption, là ça nous arrange mais en pratique c’est pas toujours aussi cool)
En informatique, on a les mêmes phénomènes qui se produisent, mais en binaire. Sauf erreur pour la norme IEE-754 on a 52 bits au lieu de 3 chiffres significatifs, mais sinon le fonctionnement est plus ou moins pareil !
Donc en gros, tu dois choisir entre des calculs rapides, avec une quantité de bits fixes, mais parfois imprécis, ou alors des calculs exacts, avec une représentation sur une quantité de bits variable, mais nettement plus lents.
ET on s’est aperçu qu’en fait, la précision absolue, on n’en avait la plupart du temps pas besoin. Au-delà d’une certaine limite, ça n’a plus tant d’importance. Dans les jeux on n’a pas besoin d’une précision au millième de millimètre. En sciences souvent non plus, car les appareils de mesure ont leurs limites. Souvent pas non plus dans l’industrie, car une machine plus précise est plus chère et du coup plus forcément rentable, et là aussi il y a des limites physiques. Il reste les maths théoriques, et la finance, entres autres…