• # Pourquoi calculer en virgule flottante?

    Posté par (site web personnel) . En réponse au journal [Humour] vers un monde différent. Évalué à 10. Dernière modification le 21 décembre 2017 à 11:36.

    On a de temps en temps des discussions ici sur le calcul en virgule flottante et les désagrément qu'il peut causer à ceux qui en découvrent les limitations, mais on ne parle presque jamais de ce à quoi sert le calcul en virgule flottante... c'est-à-dire de la raison pour laquelle on a développé cet outil! Réparons cet oubli.

    Quand on calcule, disons avec des nombres réels, il y a très peu de nombres que l'on sait représenter et très peu d'opérations que l'on sait mener exactement. Les nombres que l'on sait bien représenter sont les nombres rationnels (avec un numérateur et un dénominateur pas trop gros) et les opérations que l'on sait bien mener sont l'addition, la soustraction, la multiplication, la division et la comparaison.

    Si on veut faire exactement ces cinq opérations les nombres rationnels sont le plus grand sous-ensemble (sous-anneau pour être précis) des nombres réels qui marche. Si par exemple j'ajoute un nombre irrationnel comme la racine carrée de 2 par exemple, le calcul symbolique exact reste possible mais la comparaison devient un problème difficile: d'une part il devient coûteux en temps et en espace de déterminer si un nombre est plus grand qu'un autre et tester l'égalité devient aussi un problème – et si on fait abstraction de quelques cas faciles, ces problèmes sont largement irrésolus si on veut travailler avec plusieurs irrationnels simultanément. Ainsi, pour calculer exactement, si on s'en tient aux opérations arithmétique de base, il faut utiliser les nombres rationnels.

    Mais les opérations arithmétiques de base ne recoupent pas tout ce qu'on fait en calcul scientifique.

    Par exemple la fonction exponentielle, et partant la fonction logarithme et toutes les fonctions trigonométriques prennent des valeur irrationnelles aux point rationnels de la droite réelle (à quelques exceptions notoires, comme exp 0 = 1). Ainsi par exemple exp 2 n'est pas rationnel, comment calculer avec ce nombre? Il y a deux approches, et seulement deux car on ne sait pas faire grand chose d'autre: soit on calcule de façon symbolique soit en prenant une valeur approchée. Le calcul symbolique ne marche que dans les cas les plus simples, si je construis deux expression complexes avec des nombres entiers et des nombres irrationnels obtenus par divers moyens, on ne peut pas les comparer facilement par exemple, et toutes les opérations plus complexes sont impraticables. Le calcul d'une valeur approchée lui est parfois possible. (Mais pas toujours: parfois on sait démontrer l'existence d'un nombre sans que cela en fournisse une méthode de calcul approché, en mathématiques il y a aussi des "constantes universelles".)

    Mais l'exponentielle n'est qu'un exemple! Il existe beaucoup d'autres fonctions classiques comme les fonctions de Bessel, les fonctions gamma d'Euler, par exemple, dont on ne sait pas calculer les valeurs exactement. Si on pratique le calcul intégral, qu'on travaille avec des limites de suites ou de séries, qu'on recherche les zéros d'une fonction, ou encore qu'on recherche la solution d'une équation différentielle, on se retrouve avec autant d'exemples où le calcul symbolique (et a fortiori le calcul sur les nombres rationnels) est impossible à utiliser. C'est précisément à ce genre de calculs que servent les nombres en virgule flottante, et fournissent une très bonne solution: puisque par nature le calcul exact n'est pas possible, autant privilégier la vitesse de calcul. De plus le calcul en virgule flottante donne un cadre où l'on peut utiliser diverses techniques pour maîtriser l'erreur commise – c'est bien-sûr un sujet de recherche en soi! Un exemple simple de ces techniques est la méthode de sommation de Kahan. Pour résumer, le problème de physique les plus complexe qu'on sache résoudre exactement avec les moyens de l'arithmétique exacte est celui de la chute d'un corps soumis à une force (son poids) et pour tout le reste on doit utiliser des techniques de calcul approché. En pratique on utilise une approche mixte: c'est très difficile de construire une bonne approximation pour une fonction arbitraire, donc en pratique on utilise le calcul symbolique pour essayer de construire une méthode de calcul qui tire parti de calculs numériques bien compris!

    Pour en revenir à la découverte du journal:

    >>> 2 - 1.8 - 0.2
    -5.551115123125783e-1

    C'est la démonstration que Python n'utilise pas l'arithmétique exacte pour mener ce calcul et si ce n'est pas le comportement escompté il faut se documenter et rechercher la méthode appropriée!