D'ailleurs, je me pose tout le temps la question, au point d'en être arrivé à fuir les flottants autant que faire se peut, c'est quoi qu'il faut utiliser pour tester une égalité? Je veux dire, la valeur qu'il faut utiliser pour dire "+- foo", c'est combien?
La théorie c'est que pour voir si x et y, deux flottants, sont "égaux", c'est qu'il faut voir si la valeur absolue de leur différence est inférieure à un seuil. Donc techniquement, il suffit de faire:
abs(x-y) < seuil
La seule question en suspend est de trouver le seuil. Sauf que là, ça va dépendre de ce que tu cherches. Si tu connais les ordres de grandeur de x et y attendus, et que tu as une idée de ce que tu tolères ou que tu peux calculer le nombre de bit de bruit introduit par les arrondis des calculs, tu peux facilement calculer un seuil.
Si tu ne connais pas les valeurs attendues (ni x, ni y ne sont constants, et tu ne connais pas le phénomène physique derrière), tu peux remplacer cela par un seuil relatif, quelque chose comme
abs(x-y)/y < seuil
Et tu choisis seuil en fonction du type de flottant que tu utilises. Sauf que là, il va falloir aussi gérer les cas où y == 0, ou proche de 0, qui peuvent provoquer des NaN, Inf, ou des overflows...
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.
[^] # Re: Sérieusement ?
Posté par 2PetitsVerres (Mastodon) . En réponse au journal Encore des nouvelles de Fortran. Évalué à 5.
La théorie c'est que pour voir si x et y, deux flottants, sont "égaux", c'est qu'il faut voir si la valeur absolue de leur différence est inférieure à un seuil. Donc techniquement, il suffit de faire:
La seule question en suspend est de trouver le seuil. Sauf que là, ça va dépendre de ce que tu cherches. Si tu connais les ordres de grandeur de x et y attendus, et que tu as une idée de ce que tu tolères ou que tu peux calculer le nombre de bit de bruit introduit par les arrondis des calculs, tu peux facilement calculer un seuil.
Si tu ne connais pas les valeurs attendues (ni x, ni y ne sont constants, et tu ne connais pas le phénomène physique derrière), tu peux remplacer cela par un seuil relatif, quelque chose comme
Et tu choisis seuil en fonction du type de flottant que tu utilises. Sauf que là, il va falloir aussi gérer les cas où y == 0, ou proche de 0, qui peuvent provoquer des NaN, Inf, ou des overflows...
Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.