[Resolu] Float constant ou pas?
Tout d'abord salut à tous,
Ca fait longtemps que je parcours ce forum mais ce n'est que maintenant que je me décide à participer :)
Voilà j'ai un soucis pour lequel j'ai quelques difficultés à trouver la solution, malgré avoir googliser un moment et fait pas mal de test ...
J'aimerai savoir si il y aurait pas une méthode simple de savoir si un float est constant (plus ou moins).
Je vous explique le cas concret, pour un wolf3D, j'ai en fait un système d'equations paramétriques d'une droite (x = x0+k*Vx..) dans lequel je fais varier k, et je dois reperer le moment ou x ou y est constant (donc changement de case dans le laby pour ceux qui connaissent un peu le principe), toujours est-il que je sais pas comment procéder pour ça, si quelqu'un pouvait m'éclairer ça serait sympa ;)
ps. une haute précision étant inutile on peut considérer 5.00042 comme constant :p
Re: Float constant ou pas?
Citation:
Envoyé par {Anthony}
Voilà j'ai un soucis pour lequel j'ai quelques difficultés à trouver la solution, malgré avoir googliser un moment et fait pas mal de test ...
J'aimerai savoir si il y aurait pas une méthode simple de savoir si un float est constant (plus ou moins).
Tu veux dire si deux valeurs sont égales ? On ne peut pas utiliser == ni !=. Par contre, on sait approcher la chose comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#include <math.h>
#include <float.h>
int are_float_equal (float a, float b)
{
return fabs (a - b) < FLT_EPSILON;
}
int are_double_equal (double a, double b)
{
return fabs (a - b) < DBL_EPSILON;
} |
Re: Float constant ou pas?
Remarque preliminaire: l'utilisation correcte de flottants est tres compliquee. C'est une modelisation des reels, mais elle n'a pas un certain nombres de proprietes des reels.
Citation:
Envoyé par Emmanuel Delahaye
Tu veux dire si deux valeurs sont égales ? On ne peut pas utiliser == ni !=.
Si on peut. Pas tout le temps, mais c'est parfois approprie.
Citation:
Par contre, on sait approcher la chose comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#include <math.h>
#include <float.h>
int are_float_equal (float a, float b)
{
return fabs (a - b) < FLT_EPSILON;
}
int are_double_equal (double a, double b)
{
return fabs (a - b) < DBL_EPSILON;
} |
L'utilisation aveugle de ces fonctions n'est en rien meilleure que celle aveugle de == et !=. En fait elle est pire parce qu'on croit avoir resolu le probleme alors que pour des valeurs sont superieures a 1 on ne fait rien de different (par definition FLT_EPSILON c'est le plus petit float tel que 1+x != 1) et que si on travaille avec des nombres petits, on va admettre comme egal des choses comme x et 1E6*x et il est a priori douteux que ce soit ce qu'il faut.
Si on veut donner une recette, quelque chose comme:
Code:
1 2 3 4
| int are_float_equal (float a, float b)
{
return fabs (a - b) <= 8*FLT_EPSILON*(fabs(a)+fabs(b));
} |
est le minimum. Il faut vraissemblablement ajuster le 8 suivant la maniere dont les calculs se font. Chercher "What every computer scientist should know about floating point" de Goldbert sur google pour plus d'info.