Introduction à l’arithmétique flottante

Comprendre et limiter les erreurs inhérentes au calcul numérique

a marqué ce sujet comme résolu.

Le tutoriel en l'état est de bonne qualité, mais tu pourrais peut-être encore l'améliorer en parlant des pourquoi :

  • Pourquoi la représentation à virgule flottante est-elle la plus utilisée ?
  • Pourquoi passer par la notation scientifique ?

Vayel

Je pense que je vais en parler un peu dans la partie "limitations". On peut y parler de précision, gamme de valeurs, etc. Je vais pas détailler à fond les avantages et les inconvénients par rapport à d'autres représentations, parce que ça m'obligerait à les introduire. J'ai pas envie de faire un cours sur les réels en machine. Juste un cours sur les flottants en machine et les erreurs de calcul rigolotes qui vont avec. Cependant la dernière partie ouvrira un peu sur quadruple précision, BCD et autre.

Je pense que je vais en parler un peu dans la partie "limitations". On peut y parler de précision, gamme de valeurs, etc. Je vais pas détailler à fond les avantages et les inconvénients par rapport à d'autres représentations, parce que ça m'obligerait à les introduire.

Tout à fait. :)

Du coup, recherches-tu une relecture de la suite maintenant, ou comptes-tu la revoir avant, sachant que le début a été remanié ?

+0 -0

Bonjour les agrumes !

La bêta tutoriel « Effectuer des calculs numériques précis » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


Grosse restructuration

  • Section 1 : les flottants (en release candidate)
  • Section 2 : phénomènes gênant chez les flottants (en cours d'avancement)
  • Section 3 : parades plus évoluées (ébauche seulement).
+0 -0

Je ne relève que les points concernant le fond.

Introduction

Pour suivre au mieux ce tutoriel, il est nécessaire d'être à l'aise avec la numération en base 2.

Tu pourrais mentionner ici les nombres à virgule. En effet, on les étudie rarement en base 2 (seulement les entiers). Ca ne me gêne pas que ce soit en pré-requis, j'ai simplement été surpris que tu parles de la notation scientifique en base 2 en plus d'explications.

Représentation des réels en machine

le significande m

Le fait que tu l'appelles $m$ pourrait porter à confusion, vu que cette lettre désigne assez naturellement la mantisse. Si tu changes et renommes la mantisse $m$, n'oublie pas de modifier les $a_i$ en $m_i$.

un champ de 11 bits codant de manière combinée pour l'exposant et la partie entière du significande.

Ce n'est pas très clair, mais je comprends que tu ne puisses pas vraiment faire autrement. De toute façon, ça s'éclaircit plus bas. Peut-être reformuler en un truc du genre :

un champ de 11 bits codant l'exposant et fournissant des informations sur la partie entière du significande.

Nous allons maintenant nous intéresser à la précision des flottants et l'étendue des valeurs représentables, en séparant les normalisés et les dénormalisés à chaque fois.

Il me semble préférable de commencer une autre section à partir de là. Actuellement, la première est longue.

Pour les nombres normalisés, le nombre de chiffres pour le significande est toujours le même : 52 pour la mantisse plus 1 pour la partie entière, soit 53 bits.

Je chipote, mais c'est aussi le cas pour la forme dénormalisée. On a juste des chiffres valant zéro. :P

En fait, si je dis ça, c'est que "le nombre de chiffres" n'est pas très clair, vu que la quantité de bits stockés en machine ne varie pas.

alors ses plus proches voisins seront éloignés d'exactement 2e−52

J'ai buté sur le $2^{-52}$ dans la formule. Peut-être pourrais-tu expliciter ton raisonnement ?

Les flottants avec un grand exposant seront plus écartés les uns des autres, car le changement du dernier bit de la mantisse correspondra alors à un bond en avant de plusieurs milliers, millions, voire plus. Au contraire, pour les petits flottants normalisés, le changement du dernier chiffre après la virgule correspondra à un petit changement.

Vu que tes lecteurs sont supposés être à l'aise avec la notation scientifique (à préciser en introduction ?), ce n'est peut-être pas nécessaire, mais tu pourrais expliciter cela en prenant des exemples. Ca permettrait de clarifier justement le $2^{-52}$.

L'essentiel est que la précision relative reste constante, et cet objectif est atteint puisque les mantisses de deux nombres consécutifs ne diffèrent que de 2−52.

J'ai buté là-dessus. Aurais-tu une formule pour illustrer (et même prouver :P) tes propos ?

On obtient les valeurs extrêmes suivantes.

Il me semble intéressant de détailler la parenthèse : $2 - 2^{-52}$.

Il s'agit aussi du plus grand flottant tout court, puisque les normalisés représentent de petits flottants.

Les dénormalisés. :P

Flottants dénormalisés

Il faudrait que je revienne dessus mais deux remarques rapides :

  • La partie sur la précision n'est pas claire, tu vas vite.
  • Je bloque toujours sur la parenthèse de la formule pour le plus grand dénormalisé.

L'ordre des propos est bien mieux qu'avant. Maintenant, il s'agit simplement d'éclaircir les passages techniques. :)

+0 -0

Bonjour les agrumes !

La bêta de votre tutoriel « Arithmétique flottante pour le calcul scientifique » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


J'ai fait une grosse restructuration. Le contenu est essentiellement inchangé. Seule les deux premières parties sont actuellement là, la troisième est encore en gestation.

Pas besoin de correction orthographique pour le moment, je cherche plus des retours sur la structure, la pédagogie, et les bêtises que j'ai pu dire.

+0 -0

Merci pour cette mise à jour. :)

J'ai testé une nouvelle façon de commenter les tutoriels : j'ai récupéré l'archive du tien, l'ai importée et ai ajouté mes remarques directement dans le tutoriel-clône (auquel je t'ai ajouté comme auteur). Je n'ai pas touché au texte, seulement ajouté des blocs de citation pour les remarques. Tu peux donc les prendre en compte (ou non), enlever lesdits blocs, exporter le tutoriel-clône et mettre à jour la version originale à partir de l'archive récupérée.

+0 -0

Finalement, je vais mettre mes remarques ici. Concernant le chapitre Représentation des réels en machine :

Principes généraux

Ces opérations agissent sur des mots machine, c'est-à-dire en fonction du processeur 64 bits, 32 bits, etc.

Cette phrase est bizarrement formulée. J'aurais bien ajouté un "sur" : Ces opérations agissent sur des mots machine, c'est-à-dire, en fonction du processeur, sur 64 bits, 32 bits, etc.

Par exemple, nous pouvons séparer notre mot machine de 8 bits en 6 bits pour les $a_k$ et 2 bits pour $e$. Dans cette représentation, le mot [00101010] correspond à $[001010]\cdot 2^{-[10]}$, et on peut calculer sa valeur décimale.

J'ignore pourquoi, mais j'ai complètement bloqué là-dessus. Je ne comprenais pas pourquoi on avait $[00101010] = [001010]\cdot 2^{-[10]}$. En fait ce n'est pas du tout ça, mais une concaténation de la mantisse et de l'exposant.

$$ [001010]\cdot 2^{-[10]} = [001010] \cdot 2^{-2} = 0 \cdot 2^{-2} + 1 \cdot 2^{-1} + 0 \cdot 2^{0} + 1 \cdot 2^1 = 2,5 $$

Tu pourrais peut-être expliciter la deuxième égalité, en convertissant la mantisse en décimal avant de distribuer le $2^{-2}$.

En virgule fixe, il faudrait faire un choix entre petites et grandes valeurs. Si on prend beaucoup de bits pour la partie fractionnaire, la grande valeur sera trop grande et ne pourra pas être stockée. Si on prend beaucoup de bits pour la partie entière, la plus petite valeur sera arrondie vers zéro.

Tu pourrais peut-être illustrer cela, en prenant des exemples où on accorde une fois beaucoup de bits à la partie fractionnaire, et l'autre à la partie entière.

En virgule flottante, c'est l'exposant qui donne l'ordre de grandeur. Ainsi, il suffit d'avoir quelques bits pour stocker l'exposant, et bénéficier d'un important effet multiplicateur ou diviseur.

On ne peut pas avoir d'effet multiplicateur avec la représentation que tu as donnée vu qu'elle est de la forme $m \times 2^{-e}$. Il ne me semble pas absurde d'introduire dès maintenant un bit de signe pour l'exposant.

En virgule flottante, diviser par 1000 revient à déplacer la virgule. Si on peut stocker 5 chiffres décimaux, diviser 1123,2 par 1000 donne 0,11232. Aucun chiffre n'a été perdu. Les nombres peuvent être stockés de manière satisfaisante quelque soit leur grandeur.

Tu pourrais renseigner la valeur de l'exposant, même si on est encore incapable de le déterminer à partir du nombre (on ignore que la notation scientifique est employée). Mais je pense que ça aiderait à comprendre (c'est actuellement tout à fait clair pour moi, mais je connais déjà un peu le sujet).

Les flottants binaires double précision selon IEEE-754

  • le significande $s$, un nombre tel que $0 \leq s < 2$;

C'est quoi un nombre ? Un réel ?

  • un champ de 11 bits codant de manière combinée pour l'exposant et la partie entière du significande.

J'ai buté là-dessus. Tu pourrais, avant d'expliquer comment on stocke un tel nombre, donner des exemples (en décimal et en binaire).

Tu pourrais aussi préciser que la partie entière vaut soit 0 soit 1 ; tu l'as déjà dit plus haut, mais il ne me semble pas absurde d'insister.

$$ s = \mathrm{E}(s) + [0.a_1 a_2 a_3 \dots a_{51} a_{52}] $$

$\mathrm{E}([s])$ ? $[\mathrm{E}(s)]$ ?

La représentation biaisée des entiers relatifs est utilisée : les 11 bits codent un entier naturel entre 0 et 2047, auquel on soustrait 1023 pour obtenir le nombre relatif représenté.

Tu pourrais fournir un lien explicatif sur la représentation biaisée.

Autres formats à virgule flottante

Format décimaux

Je ne suis pas sûr de comprendre le fait d'avoir une quantité non entière de bits d'exposant.

Merci !

+0 -0

Et hop, la suite, sur le chapitre Approximation des réels par les flottants.

Plus grand et plus petit flottants

De plus, il n'y a pas de plus petit réel non nul :

réel positif

Zéro est représentable dans un flottant (mantisse nulle, champs pour l'exposant à zéro).

A -1023 plutôt. Même si je vois ce que tu veux dire.

Dépassement et soupassement

Ces choix d'arrondi sont-ils inscrits dans la norme IEEE-754 ?

Précision des flottants

La précision correspond au nombre de bits significatifs que l'on peut stocker pour représenter une valeur. Les bits significatifs correspondent aux bits du significande à partir du premier bit non-nul.

Il me semble intéressant de donner un exemple. J'ai un peu bloqué sur la partie concernant les flottants dénormalisés, et je pense que c'est dû au fait que je n'avais pas complètement assimilé cette histoire de bits significatifs.

Par exemple, un format dans lequel on ne peut stocker que les dixièmes a une précision plus faible qu'un format où l'on peut stocker les dixièmes et les centièmes, puisque les nombres sont plus proches dans le premier format que dans le deuxième.

N'est-ce pas l'inverse ?

La précision relative correspond à l'écart entre deux nombres relativement à leur ordre de grandeur.

Il me semble intéressant de donner un exemple.

La figure ci-dessous montre ce phénomène, en montrant l'écart entre deux flottants normalisés consécutifs en fonction de la valeur du flottant.

Tu parles ici d'écart alors que sur la figure, il est question de précision.

Arrondis

La norme IEEE-754 définit quatre modes d'arrondi :

Il me semble intéressant d'expliciter ces modes, comme le fait KFC ici. D'ailleurs, pour les deux derniers, dont tu as déjà parlé plus haut, tu as seulement expliqué ce qu'il se passait quand on dépassait $\Omega$, sans vraiment parler d'arrondi par excès (on prend le flottant le plus proche le plus grand).

Puisque la précision absolue varie en fonction de la valeur du flottant, on préférera utiliser la précision relative. On a donc une erreur d'arrondi d'au pire $2^{-53}$.

Une erreur relative, du coup ? Il me semble judicieux de le préciser, parce que là on a un peu l'impression qu'on fait ce qu'on veut : la précision absolue ne me convient pas, eh bien je n'ai qu'à prendre celle relative.


C'est de l'excellent travail, merci beaucoup. :)

+0 -0

Bonjour les agrumes !

La bêta de votre tutoriel « Arithmétique flottante pour le calcul scientifique » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


J'ai entièrement refait le paragraphe « Principes généraux ». Les nombres à virgule fixe, on s'en fiche complètement ici. J'ai préféré parler des besoins de la physique et de la mathématique à la place. Ça sera sûrement à retravailler par contre.

Sinon Vayel, j'ai pris en compte toutes tes remarques, à l'exception de quelques unes qui demandent plus de travail (dans la partie sur la précision).

Par ailleurs, j'ai réussi à me procurer la norme, donc j'ai plus de détails sur ce qu'elle requiert, et je peux en parler proprement. Le seul problème étant maintenant de comprendre ce que fait réellement Python, qui n'est pas totalement conforme.

+0 -0

Bonjour les agrumes !

La bêta de votre tutoriel « Introduction à l&#39;arithmétique flottante » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


Mises à jour

  • Réorganisation de la partie "Représentation des réels en machine"
    • séparation de la partie "contraintes" et "principe des flottants"
    • Traitement des dénormalisés comme une exception (dans la description de binary64 et dans la suite)
  • Grosse réorganisation de la deuxième partie :
    • mise en encadré des remarques sur les dénormalisés
    • séparation de la partie "comparaison avec les réels" et "modes d'arrondi"
    • partie dédiée pour le calcul de l'erreur d'arrondi, avec des exemples d'application
  • La troisième partie est toujours au point mort.
+0 -0

Concernant l'absorption, tu pourrais en profiter pour expliquer pourquoi il est préférable de sommer des termes dans l'ordre croissant (en valeur absolue).

Vayel

Je pense en parler au niveau de la série harmonique. Il faut que je teste voir si j'arrive à faire le calcul complet dans les deux sens aussi (en temps raisonnable).

Je me permets de pinailler à propos de la partie sur la performance du premier chapitre. Tu y dis ceci :

Pour calculer rapidement, il faut représenter un nombre dans un seul mot machine, car cela permet de câbler les opérations de base (addition, soustraction, etc.) directement dans le processeur, et donc de les effectuer très rapidement. Schématiquement, toutes les opérations qu'effectue un processeur ne peuvent en effet agir que sur des mots machines, en raison de son organisation interne. Si un nombre tenait sur plusieurs mots machine, alors il faudrait décomposer les opérations de bases en sous-opérations élémentaires, et le processeur mettrait plus de temps à les traiter.

Techniquement, c'est faux. Rien n’empêche de microcoder les opérations de base avec des flottants qui tiennent sur un mot machine. Historiquement, les premiers processeurs qui géraient les flottants émulaient ceux-ci avec l'ALU entière et un peu de microcode : pas besoin de gaspiller du circuit dans une FPU. De plus, de nombreux processeurs ont géré des nombres de taille arbitraire, en utilisant du microcode : les premiers processeurs travaillaient d'ailleurs sur des entiers BCD de taille arbitraire, stockés comme des chaines de caractère en mémoire RAM. Et c'était loin d'être systématiquement moins ou plus rapide que les implémentations logicielles : tout dépend de la micro-architecture et des possibilités d'optimisation du microcode qui vont avec.

En fait, la seule chose qui soit importante du point de vue de la performance, c'est le format de nombre lui-même et l'influence qu'il a sur l'implémentation des calculs en circuits. Il faut que les calculs prennent peu de circuits et que ceux-ci aient une profondeur logique (la longueur du chemin critique) faible. Et cela demande de travailler sur la manière dont on représente les nombres en binaire. Et cela dépend de l'opération. Par exemple les flottants logarithmiques permettent des multiplications et divisions ultra-rapides (aussi rapides que les opérations entières), mais foirent pour l'addition et la soustraction. Pour d'autres formats de flottants, c'est inverse. On n'a pas encore trouvé de méthode miracle et les flottants IEEE745 sont juste un compromis.

Après, c'est difficile à expliquer à un débutant complet et je serais d'avis de rester assez évasif sur le sujet. Il faudrait juste dire que la manière dont on fait les calculs dépend du format de nombre utilisé, et que cela aura un impact sur les circuits qui font ces calculs et leur performance.

Pour le fait que la représentation des flottants est parfaitement symétrique, tu pourrais ajouter que cela fait qu'il existe un +0 et un -0. Et que cela peut poser des problèmes dans les calculs. Et dire au passage que c'est à cause de l'utilisation du bit de signe, pour la même raison que pour les entiers en signe-magnitude.

Pour la répartition des flottants, tu devrais donner un schéma de principe qui montre tout de - l'infini à + l'infini (mais pas à l'échelle, ni en représentant tous les flottants, évidemment). Cela permettrait de mieux illustrer les variations de densité. En tout cas, bon courage pour le reste de la rédaction.

Merci pour ta réponse. J'étais sûr de prendre une remarque en écrivant ce paragraphe bancal, c'est pas loupé. :D

Après, c'est difficile à expliquer à un débutant complet et je serais d'avis de rester assez évasif sur le sujet. Il faudrait juste dire que la manière dont on fait les calculs dépend du format de nombre utilisé, et que cela aura un impact sur les circuits qui font ces calculs et leur performance.

OK, je vais suivre le conseil. Je pense dire quelque chose du genre "pour être le plus rapide possible, il est intéressant d'avoir un format pour lequel le câblage des opérations du processeur est performant. Cela passe par des compromis, notamment le fait de favoriser un format sur un seul mot machine". Tu penses que ce serait correct ?

Bonjour les agrumes !

La bêta de votre tutoriel « Introduction à l&#39;arithmétique flottante » a été mise à jour et coule sa pulpe à l'adresse suivante :

Merci d'avance pour vos commentaires.


Rien de neuf, si ce n'est que j'ai ajouté la source de l'illustration du tutoriel.

Du coup, il m'est venu une question. La page web dit :

All images are copyright 2005 by Craig S. Kaplan. You are free to use them for personal and non-commercial purposes. Please check with me about any other uses.

À votre avis, est-ce que l'illustration d'un tutoriel rentre dans ces conditions ou je dois absolument contacter l'auteur ?

+0 -0
Ce sujet est verrouillé.