Introduction à l’arithmétique flottante

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

a marqué ce sujet comme résolu.

Bonjour les agrumes !

La bêta de votre tutoriel « Introduction à l'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

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.


Je reprends ce tutoriel là où je l’avais laissé il y a déjà plus de deux ans et demi !

À ma bonne surprise, il est plus avancé que je ne me souvenais, donc j’ai bon espoir de réussir à le finir cette année (à moins que ce ne soit encore dans deux ans :D ).

Ce week-end, j’ai essayé d’avancer les chapitres qui n’étaient pas du tout avancés, essentiellement dans la partie 3.

+2 -0

Chouette !

Quelques retours sur l’introduction :

Pourtant, même le plus simple des programmes peut avoir un comportement surprenant, comme le montre l’exemple suivant, écrit en Python

Il me semble plus clair, parce que moins chargé, de mettre le code sous forme "interpréteur" :

>>> x = 0.1
>>> x + 0.2 == 0.3
False

Comme des bases en programmation font partie des pré-requis, j’enlèverais également les commentaires qui surchargent à mon sens la chose.

Ici, les arrondis faits par la machine rendent le comportement difficilement prédictible.

Tu introduis les arrondis de façon un peu abrupte. Peut-être pourrais-tu ajouter une phrase de transition du genre : "Cette inégalité inattendue est due aux arrondis de calcul effectués par la machine, qui rendent le comportement difficilement prédictible".

Tu pourrais aussi mentionner que ce n’est pas propre à Python.

Par exemple, pendant la première guerre du Golfe

Aurais-tu des sources ?

Ce tutoriel est une introduction à l’arithmétique des nombres flottants.

Là aussi, la notion de nombre flottant me semble introduite un peu rapidement. Tu pourrais ajouter une transition du type "En informatique, on approxime souvent les nombres réels par des nombres dits flottants (nous expliquons pourquoi dans la suite). Ce tutoriel est…".

Merci !

+0 -0

Je suis déjà familier avec ces notions donc ce n’est pas un retour de débutant.

Représentation des réels en machine

Exigences pour une représentation des réels en machine

Il existe des solutions pour représenter les réels de manière exacte en machine.

Je pense que tu devrais ajouter une section pour introduire cette phrase. Cette section contiendrait :

  • Un rappel de ce qu’est un nombre réel
  • Le fait qu’il y en a beaucoup
  • Ce qu’est une représentation d’un nombre en machine
  • La difficulté d’avoir une représentation exacte des réels (mémoire requise si je ne m’abuse)

qui sont les seules à remplir les exigences principales pour le calcul numérique, à savoir l’amplitude, la précision, et la performance.

L’amplitude d’une représentation correspond aux ordres de grandeur des nombres représentables

Ca fait un peu bizarre de dire que les "ordres de grandeur des nombres représentables" sont une des "exigences principales pour le calcul numérique". Il s’agit plutôt d’une propriété de la représentation et on a un niveau d’exigence sur la valeur de cette propriété, non ?

Ces deux constantes se côtoient dans les calculs d’électrostatique, mais n’ont pas du tout le même ordre de grandeur (109 pour la constante de Coulomb et 10–19 pour la charge élémentaire). Il est donc important que la représentation des réels utilisée garde la même précision quelque soit l’ordre de grandeur.

Je chipote, mais j’ai l’impression le fait qu’il soit "important que la représentation des réels utilisée garde la même précision quelque soit l’ordre de grandeur" n’est pas lié au fait que les deux constantes apparaissent dans le même calcul mais qu’elles apparaissent dans un calcul tout court (on veut la même précision pour 1+10151+10^{-15} et 1+10151+10^{15}).

Représentation des réels par les nombres à virgule flottante

Rappel sur la notation scientifique

Tu pourrais donner un exemple de nombre écrit en notation scientifique et mentionner le fait que tout réel peut être écrit de cette façon.

Stocker un nombre à virgule flottante est très simple, car il suffit de stocker les chiffres (binaires) du significande, son signe et l’exposant.

Et le signe de l’exposant ?

pour ee entre -1000 et 1000 (en base 2)

Le "en base 2" n’est pas très clair puisque 1000 (mille) s’écrit comme un nombre en notation binaire.

Merci.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.


Représentation des réels en machine

Exigences pour une représentation des réels en machine

Il existe des solutions pour représenter les réels de manière exacte en machine.

Je pense que tu devrais ajouter une section pour introduire cette phrase. Cette section contiendrait :

  • Un rappel de ce qu’est un nombre réel
  • Le fait qu’il y en a beaucoup
  • Ce qu’est une représentation d’un nombre en machine
  • La difficulté d’avoir une représentation exacte des réels (mémoire requise si je ne m’abuse)

Je ne souhaite pas définir ce qu’est un nombre réel, parce que c’est casse-gueule ou alors informel (et n’apporte donc rien). Le fait qu’il y en a beaucoup risque de m’emmener loin, je préfère éviter d’avoir à parler d’infini indénombrable et autres joyeusetés. Je préfère aussi garder une compréhension informelle du mot représentation, parce que ce n’est rien de plus, dans ce tutoriel (un peu comme une flèche est une représentation d’un vecteur). Enfin, c’est assez simple d’avoir une représentation exacte des réels (logiciels de calcul formel typiquement), mais c’est pas pour autant qu’elle est utile (dans les sciences et techniques, le résultat arrondi est souvent plus utile).

qui sont les seules à remplir les exigences principales pour le calcul numérique, à savoir l’amplitude, la précision, et la performance.

L’amplitude d’une représentation correspond aux ordres de grandeur des nombres représentables

Ca fait un peu bizarre de dire que les "ordres de grandeur des nombres représentables" sont une des "exigences principales pour le calcul numérique". Il s’agit plutôt d’une propriété de la représentation et on a un niveau d’exigence sur la valeur de cette propriété, non ?

Il faut plutôt le prendre dans l’autre sens. Je suis physicien, j’ai un besoin (i.e. une exigence) qui est de représenter des nombres sur une grande amplitude de valeurs. En conséquence, la représentation utilisée doit pouvoir représenter différents ordres de grandeur.

Ces deux constantes se côtoient dans les calculs d’électrostatique, mais n’ont pas du tout le même ordre de grandeur (109 pour la constante de Coulomb et 10–19 pour la charge élémentaire). Il est donc important que la représentation des réels utilisée garde la même précision quelque soit l’ordre de grandeur.

Je chipote, mais j’ai l’impression le fait qu’il soit "important que la représentation des réels utilisée garde la même précision quelque soit l’ordre de grandeur" n’est pas lié au fait que les deux constantes apparaissent dans le même calcul mais qu’elles apparaissent dans un calcul tout court (on veut la même précision pour 1+10151+10^{-15} et 1+10151+10^{15}).

Ben là tu fais apparaître deux ordre de grandeur dans le même calcul, avec un écart de 1015 à chaque fois. Mais vouloir le même nombre de chiffres "significatifs" pour les deux calculs avec une seule représentation ne vas pas de soi, par exemple en virgule fixe.

Représentation des réels par les nombres à virgule flottante

Rappel sur la notation scientifique

Tu pourrais donner un exemple de nombre écrit en notation scientifique et mentionner le fait que tout réel peut être écrit de cette façon.

C’est juste un rappel, je préfère ne pas m’étendre plus que ça. Que tout réel peut s’écrire comme ça, ça me paraît suffisamment facile à voir pour ne pas être mentionné.

Stocker un nombre à virgule flottante est très simple, car il suffit de stocker les chiffres (binaires) du significande, son signe et l’exposant.

Et le signe de l’exposant ?

C’est sûrement trop subtil dans le texte… Chiffres du significandes = suite de chiffres (pas de signe, pas de virgules, rien) ; signe du significande, évident ; l’exposant = un entier dans toute sa généralité (notamment signé). T’as des idées pour clarifier ?

pour ee entre -1000 et 1000 (en base 2)

Le "en base 2" n’est pas très clair puisque 1000 (mille) s’écrit comme un nombre en notation binaire.

Vayel

OK, c’est réglé.

+0 -0

Je ne souhaite pas définir ce qu’est un nombre réel, parce que c’est casse-gueule ou alors informel (et n’apporte donc rien). Le fait qu’il y en a beaucoup risque de m’emmener loin, je préfère éviter d’avoir à parler d’infini indénombrable et autres joyeusetés. Je préfère aussi garder une compréhension informelle du mot représentation, parce que ce n’est rien de plus, dans ce tutoriel (un peu comme une flèche est une représentation d’un vecteur). Enfin, c’est assez simple d’avoir une représentation exacte des réels (logiciels de calcul formel typiquement), mais c’est pas pour autant qu’elle est utile (dans les sciences et techniques, le résultat arrondi est souvent plus utile).

Peut-être pas une section effectivement, mais juste rappeler qu’un nombre réel est un "nombre à virgule" et qu’il y en a une infinité, ce qui pose la question de leur représentation numérique.

C’est sûrement trop subtil dans le texte… Chiffres du significandes = suite de chiffres (pas de signe, pas de virgules, rien) ; signe du significande, évident ; l’exposant = un entier dans toute sa généralité (notamment signé). T’as des idées pour clarifier ?

Juste une parenthèse du type "et l’exposant (sous forme d’entier signé)" ? Mais, du coup, le lecteur va se demander pourquoi on ne fait pas la même chose pour le significande (le stocker sous forme d’entier signé).

+0 -0

Approximation des réels par les flottants

L’ensemble des flottants

Il est possible de représenter l’infini dans un flottant (mantisse nulle et exposant à la valeur spéciale +1024), mais il ne s’agit pas vraiment d’un nombre.

Plutôt que d’employer le terme (non défini je crois) de nombre, tu pourrais dire que les infinis ne sont pas des réels.

et la plus grande mantisse possible pour cet exposant (52 uns après la virgule)

J’ai tilté en lisant "52 uns". Tu pourrais rappeler que tu parles de binaire.

On obtient donc le flottant suivant, qui est la plus grande valeur représentable avec un flottant binaire double précision.

Tu pourrais rappeler un ordre de grandeur intuitif comparable (un truc du genre "volume de l’univers observable", même si ce n’est pas le cas ici). Autrement dit, tu pourrais répondre à la question : dans quels cas d’application risque-t-on d’atteindre cette borne ?

La précision correspond au nombre de chiffres du significande qu’il est possible de stocker. 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.

J’ignore si ça vaut le coup d’ajouter une note au sujet de cette remarque : si je ne peux stocker qu’un chiffre, suis-je plus précis en stockant celui des dixièmes ou celui des centièmes ? J’imagine que ça ne fait pas sens de stocker les centièmes sans les dixièmes.

Par exemple, le flottant dénormalisé suivant à seulement 51 bits de précision

a

alors les mantisses de ses deux plus proches voisins x+x+ et x−x− s’obtiennent en changeant le 52e bits après la virgule :

Ce n’est pas suffisant : 1.08<1.09<1.101.08 < 1.09 < 1.10 (en décimales, avec une mantisse de taille 2).

Les deux figures ci-dessous montrent ce changement de densité

La figure est un peu trompeuse parce qu’on pense à la densité en regardant l’écart entre les traits. Or il est le même pour les deux cas.

Pour une vision plus complète, voici les écarts entre flottants consécutifs sur un large intervalle de valeurs.

Tu repasses en base 10. C’est un détail, mais il me semble plus clair de toujours travailler dans la même base (au moins dans la même base que celle de la figure précédente).

C’est du beau boulot, comme d’habitude.

+0 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.


Merci encore pour ta relecture.

On obtient donc le flottant suivant, qui est la plus grande valeur représentable avec un flottant binaire double précision. Tu pourrais rappeler un ordre de grandeur intuitif comparable (un truc du genre "volume de l’univers observable", même si ce n’est pas le cas ici). Autrement dit, tu pourrais répondre à la question : dans quels cas d’application risque-t-on d’atteindre cette borne ?

J’en parle un peu dans la première partie du tutoriel, sur un cas hyper-artificiel fait exprès pour être très gros. Il n’y a presque aucun cas d’application réel, donc je vais ne pas en parler.

La précision correspond au nombre de chiffres du significande qu’il est possible de stocker. 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.

J’ignore si ça vaut le coup d’ajouter une note au sujet de cette remarque : si je ne peux stocker qu’un chiffre, suis-je plus précis en stockant celui des dixièmes ou celui des centièmes ? J’imagine que ça ne fait pas sens de stocker les centièmes sans les dixièmes.

J’ai pas trop compris, tu peux préciser ? Peut-être que ça ne fait effectivement aucun sens. :°

alors les mantisses de ses deux plus proches voisins x+x+ et x−x− s’obtiennent en changeant le 52e bits après la virgule :

Ce n’est pas suffisant : 1.08<1.09<1.101.08 < 1.09 < 1.10 (en décimales, avec une mantisse de taille 2).

Je ne vois pas de problème. Tu viens de faire la même chose que ce que j’ai écrit, mais avec une représentation décimale. Non ?

Les deux figures ci-dessous montrent ce changement de densité

La figure est un peu trompeuse parce qu’on pense à la densité en regardant l’écart entre les traits. Or il est le même pour les deux cas.

C’est pour ça qu’il y a du texte. Et même si je le changeais, le schéma serait trompeur quand même, parce que je ne peux pas m’occuper de 212 ordre de grandeur avec les pixels de l’écran.

Pour une vision plus complète, voici les écarts entre flottants consécutifs sur un large intervalle de valeurs.

Tu repasses en base 10. C’est un détail, mais il me semble plus clair de toujours travailler dans la même base (au moins dans la même base que celle de la figure précédente).

Vayel

La figure d’avant est aussi en base 10… Là c’est juste une représentation log-log des flottants double précision. Alors l’échelle est en base 10, mais je n’ai rien changé à la valeur des flottants. C’est aussi fait exprès, parce que les puissances de deux ne parlent pas spécialement pour les ordres de grandeur (en tout cas, pas à moi). Comment je peux être plus clair que la légende : « Ecart entre flottants binary64 consécutifs » ?

+0 -0

J’ai pas trop compris, tu peux préciser ? Peut-être que ça ne fait effectivement aucun sens. :°

Après réflexion, ça ne fait aucun sens.

Je ne vois pas de problème. Tu viens de faire la même chose que ce que j’ai écrit, mais avec une représentation décimale. Non ?

Oui mais ce que je voulais dire c’est que changer le dernier bit ne suffit pas. Par exemple, pour passer de 0.090.09 à 0.100.10, il ne suffit pas de changer le dernier chiffre (il faut aussi changer l’avant dernier dans ce cas).

C’est pour ça qu’il y a du texte. Et même si je le changeais, le schéma serait trompeur quand même, parce que je ne peux pas m’occuper de 212 ordre de grandeur avec les pixels de l’écran.

Un compromis serait de changer l’écart entre les ticks sans respecter l’échelle. Pour 2642^{64}, tu pourrais n’avoir que trois ticks (xx^-, xx et x+x^+).

Au passage, qu’utilises-tu pour tes schémas ? Ils sont vraiment de qualité.

La figure d’avant est aussi en base 10… Là c’est juste une représentation log-log des flottants double précision. Alors l’échelle est en base 10, mais je n’ai rien changé à la valeur des flottants. C’est aussi fait exprès, parce que les puissances de deux ne parlent pas spécialement pour les ordres de grandeur (en tout cas, pas à moi). Comment je peux être plus clair que la légende : « Ecart entre flottants binary64 consécutifs » ?

Effectivement, je me suis mal exprimé, je voulais dire "puissance de deux". Le schéma fait très bien l’affaire.

Modes d’arrondi

au pair le plus proche

Tu veux dire au flottant le plus proche ? Ca parait stupide, mais "pair" fait penser à nombre pair.

En fait, c’est bien le cas. Du coup, tu peux lever l’ambiguïté en parlant de nombre pair plutôt que de pair (qui peut s’interpréter comme peer).

Mode d’arrondi par défaut

Tu pourrais compléter le titre en "Mode d’arrondi par défaut : au nombre pair le plus proche". C’est un peu moins énigmatique "Mode d’arrondi par défaut" et ça montre au lecteur que tu vas parler de ce mode en détail.

Quand j’ai lu la liste des deux familles et n’ai pas compris, je me suis demandé si j’allais avoir des réponses à mes questions plus bas. Et, juste en lisant les titres, il m’a semblé que non vu que je ne voyais apparaître nulle part le nom des familles.

En effet, une certaine liberté est laissée au langage qui implémente la norme.

Y a-t-il une raison à cela ?

Par exemple, 0,1 0,10,1 n’est pas représentable de manière exacte

J’ai un peu tilté sur le "représentable de manière exacte". Peut-être pourrais-tu ajouter une parenthèse du genre "(il n’existe pas de flottant égal à 0.10.1)".

Arrondi au plus proche

Au début, j’ai cru que tu allais parler de "au plus proche avec rupture des égalités au profit de la plus grande valeur absolue". Comme ce n’est pas le cas, j’ai l’impression que cette section est perturbante parce les titres ne correspondent pas aux éléments de la liste.

Merci.

+1 -0

Je ne vois pas de problème. Tu viens de faire la même chose que ce que j’ai écrit, mais avec une représentation décimale. Non ?

Oui mais ce que je voulais dire c’est que changer le dernier bit ne suffit pas. Par exemple, pour passer de 0.090.09 à 0.100.10, il ne suffit pas de changer le dernier chiffre (il faut aussi changer l’avant dernier dans ce cas).

C’est bon, j’ai compris ! Tu as bien raison, l’explication est bancale, voire mensongère.

C’est pour ça qu’il y a du texte. Et même si je le changeais, le schéma serait trompeur quand même, parce que je ne peux pas m’occuper de 212 ordre de grandeur avec les pixels de l’écran.

Un compromis serait de changer l’écart entre les ticks sans respecter l’échelle. Pour 2642^{64}, tu pourrais n’avoir que trois ticks (xx^-, xx et x+x^+).

C’est une plutôt bonne idée, je vais le faire.

Au passage, qu’utilises-tu pour tes schémas ? Ils sont vraiment de qualité.

J’utilise Inkscape. C’est très flexible, mais c’est pas batteries included.

Modes d’arrondi

au pair le plus proche

Tu veux dire au flottant le plus proche ? Ca parait stupide, mais "pair" fait penser à nombre pair.

En fait, c’est bien le cas. Du coup, tu peux lever l’ambiguïté en parlant de nombre pair plutôt que de pair (qui peut s’interpréter comme peer).

Bien vu, il faut même plutôt parler de chiffre pair.

En effet, une certaine liberté est laissée au langage qui implémente la norme.

Y a-t-il une raison à cela ?

Je n’ai pas de véritable explication. Les dénormalisés sont un cas très particulier. On peut juste voir ça comme une technique pour gratter des nombres un peu plus petit, au prix d’un comportement différent des autres flottants. C’est utile pour obtenir un nombre plus grand que 0 quand on additionne des flottants différents, mais dont la différence ferait zéro avec des normalisés.

Le paragraphe est assez laconique, je vais voir pour ajouter des détails.

Par exemple, 0,1 0,10,1 n’est pas représentable de manière exacte

J’ai un peu tilté sur le "représentable de manière exacte". Peut-être pourrais-tu ajouter une parenthèse du genre "(il n’existe pas de flottant égal à 0.10.1)".

OK.

Arrondi au plus proche

Au début, j’ai cru que tu allais parler de "au plus proche avec rupture des égalités au profit de la plus grande valeur absolue". Comme ce n’est pas le cas, j’ai l’impression que cette section est perturbante parce les titres ne correspondent pas aux éléments de la liste.

Vayel

Toute la section est bancale. J’ai réussi à me perdre moi-même dans les titres en relisant. :D

Merci encore à toi !

C’est beaucoup plus clair. Tu pourrais ajouter une note pour dire que tu ne vas pas parler des autres modes d’arrondi, que le lecteur ne se demande pas pendant 36 ans s’il a manqué quelque chose en ne voyant rien à leur sujet (surtout que tu parles du dépassement/soupassement, qu’on pourrait attribuer aux arrondis orientés plutôt qu’à l’arrondi par défaut).

Une remarque à part : ne devrais-tu pas enlever le tag "mathématiques" vu que le contenu appartient déjà à la catégorie du même nom ?

+0 -0

Erreurs d’arrondi

Sur l’intervalle compris entre le plus grand flottant positif +Ω+Ω et le plus grand flottant négatif −Ω−Ω

Ne devrait-on pas dire le plus petit flottant négatif, même si on comprend que tu parles de valeur absolue ?

En dehors de cet intervalle, l’erreur peut-être

peut être

alors l’erreur d’arrondi est au plus en valeur absolue

Tu peux utiliser δmax\delta_{max} au lieu de δ\delta dans la formule, comme tu le fais plus bas.

Le successeur direct de ff, f+f+, est obtenu en incrémentant le dernier bit du significande de ff

Faudrait-il parler du cas où le significande est déjà maximal (que des uns) ?

L’exposant qu’aura 2,22,2 une fois convertit

converti

À l’issue d’une opération quelconque entre deux flottants, on obtient comme résultat un certain flottant ff, issu de l’arrondi du résultat exact.

Ca ne me parait pas évident qu’on ait arrondi(r1 + r2) == arrondi(r1) + arrondi(r2), encore moins dans le cas d’opérations non linéaires (je ne dis pas que c’est faux, juste que ce n’est pas évident). Ou alors je n’ai pas compris la phrase.

Merci. :)

+0 -0

Erreurs d’arrondi

Sur l’intervalle compris entre le plus grand flottant positif +Ω+Ω et le plus grand flottant négatif −Ω−Ω

Ne devrait-on pas dire le plus petit flottant négatif, même si on comprend que tu parles de valeur absolue ?

Je me suis posé la question, et c’est dur d’être clair et concis. Je pense que préciser à chaque fois en grandeur absolue clarifierait.

Le successeur direct de ff, f+f+, est obtenu en incrémentant le dernier bit du significande de ff

Faudrait-il parler du cas où le significande est déjà maximal (que des uns) ?

Mouaif, pas vraiment besoin. Quand tu as un significande maximal et que tu incrémentes, tu te retrouves avec un nombre qui n’est pas en notation scientifique. Quand tu le remets en ordre, tu te retrouves à augmenter l’exposant et avoir le significande égal à 1. Mais ça ne change pas sa valeur.

À l’issue d’une opération quelconque entre deux flottants, on obtient comme résultat un certain flottant ff, issu de l’arrondi du résultat exact.

Ca ne me parait pas évident qu’on ait arrondi(r1 + r2) == arrondi(r1) + arrondi(r2), encore moins dans le cas d’opérations non linéaires (je ne dis pas que c’est faux, juste que ce n’est pas évident). Ou alors je n’ai pas compris la phrase.

Vayel

L’égalité que tu écris n’est pas ce que j’ai dit (ou voulu dire). Quand tu fais une opération entre flottants le résultat est l’arrondi de l’opération exacte sur ces flottants vus comme des réels. Autrement dit addition_flottante(flottant_1, flottant_2) == arrondi(flottant_1 + flottant_2).

Je n’ai pas regardé ton tuto ni a qui il s’adresse mais pour :

Je me suis posé la question, et c’est dur d’être clair et concis. Je pense que préciser à chaque fois en grandeur absolue clarifierait.

Si tu t’adresses à des gens un peu techniques c’est "le plus petit nombre". Si tu vises plus large c’est "le plus loins dans les négatifs ". Tourner autour de la notion de valeur absolu est plutôt lourd.

Dans le chapitre "Calculs avec les flottants", sous-section "Non associativité" et "Non-distributivité". Tu peux expliquer plus en détail pourquoi les calculs sont non-associatifs ou non-distributifs. La raison est que si les erreurs d’arrondis de a, b et c sont équivalentes dans les deux cas, ce n’est pas le cas des résultats intermédiaires. L’erreur d’arrondi de (a+b) n’est pas forcément la même que celle de (b+c). Les résultats intermédiaires ayant des erreurs d’arrondis différentes, cela se propage dans le résultat final. Même chose pour la non-distributivité : dans a.(b+c) et a.b+a.c, les erreurs d’arrondis de b+c et de a.b et a.c ne sont pas égales, ce qui explique les différences dans les résultats finaux.

Calcul avec les flottants

Opérations élémentaires

Pour voir un effet concret de ces phénomènes, reprenons l’exemple de l’introduction, où nous avons vu que 0,1+0,20,1+0,2 n’était pour l’ordinateur pas égal à 0,30,3.

Utiliser des f-strings rendrait probablement le code plus clair :

>>> a = 0.1
>>> f'a = {a:.17e}'
'a = 1.00000000000000006e-01'

Il n’y a d’ailleurs pas besoin de print.

peut-être majoré de la manière suivante

peut être majorée

Tu pourrais faire l’application numérique avec les variables définies dans le code Python. Ca rendrait la chose un peu moins abstraite.

revient à décaler ses bits vers la droite, si on décale trop loin, de bits vont être perdus.

Tu pourrais commencer une nouvelle phrase : "droite. Si on décale"

des bits

Dans l’exemple, c’est exactement ce qu’il se passe dans l’exemple.

Petite répétition.

>>> M - M

M - m

Tu mentionnes plusieurs problèmes possibles mais n’indique pas s’il existe des méthodes pour y remédier.

Enchaînements d’opérations

mais si vous souhaitez avoir de détails

des

référez-vous au manuel de votre langage préféré

Tu pourrais fournir le lien de celui de Python, ça donnerait un exemple des termes à rechercher.

des problèmes de reproductibilités des résultats

reproductibilité

Pourtant, il existe des cas où l’addition de b + c d’abord et ensuite de a ne provoque pas de dépassement. C’est le cas par exemple quand a + b est très positif, mais que c est très négatif.

Tu pourrais donner un exemple Python.

Ce phénomène arrive par exemple en cas de dépassement de la somme b + c. Le calcul effectué en développant est alors meilleur, pour peu que a soit relativement petit. Ce phénomène existe aussi avec des nombres normaux, notamment si dans une des deux formes, l’addition provoque une annulation catastrophique.

Là aussi, tu pourrais fournir un exemple Python.

Merci ! :)

+1 -0

Exemples de situations problématiques

Prenons l’exemple du calcul de la fonction polynomiale suivante :

Tu pourrais ajouter une note pour indiquer comment tu passes d’une forme à l’autre.

Deux formes s’offrent à nous : la forme factorisée et la forme développée.

Peut-être pourrais-tu rappeler laquelle est laquelle.

Différences de précision entre le calcul développé ou factorisé.

Je ne comprends pas trop le "+2" sur l’axe des abscisses. Pourquoi ne pas remplacer x par x-2 ou ajouter 2 au texte des ticks ?

On voit immédiatement que la forme factorisée est plus précise.

Il serait intéressant d’avoir un second graph avec l’échelle yy réduite. Là, on ne sait pas trop si la forme factorisée renvoie toujours 0 ou pas.

Voici un petit algorithme proposé par Kahan et Muller

La transition est un peu abrupte. On ne sait d’ailleurs pas trop (sans lire le code) si l’algorithme concerne la série harmonique ou non.

Tu pourrais aussi fournir un lien Wikipédia si cet algorithme a un nom.

Cet algorithme est assez amusant. En effet, en calculant la limite avec des réels, on converge 6. Cependant, avec des doubles, on converge vers 100.

Ce serait sympa de représenter ça graphiquement (x2 vs i).


De mémoire, tu n’as pas parlé de l’astuce consistant à prendre le logarithme pour calculer un produit (comme dans le maximum de vraisemblance). Est-ce volontaire ?

Encore merci pour ce travail de qualité. :)

+0 -0
Ce sujet est verrouillé.