Bonjour,
Mon code manipule des floats et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Vaut-il mieux tester le "signe" de la difference cout1 - cout2, ou
bien
comparer cout1 + EPSILON_FLOAT et cout2 ? (si cela fait une
quelconque
difference).
J'ai progressivement augmente EPSILON_FLOAT de facon a ce que mon
programme
ne crashe plus (!). Sachant que mon programme fait de l'ordre de 5
additions de floats pour trouver ces couts, et que les grandeurs
manipulees
sont de l'ordre de [0.1 -- 10.0], a partir de quelle valeur
d'EPSILON_FLOAT
je dois considerer qu'en fait il s'agit d'un probleme algorithmique
et pas
d'une erreur d'arrondi ?
Bonjour,
Mon code manipule des floats et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Vaut-il mieux tester le "signe" de la difference cout1 - cout2, ou
bien
comparer cout1 + EPSILON_FLOAT et cout2 ? (si cela fait une
quelconque
difference).
J'ai progressivement augmente EPSILON_FLOAT de facon a ce que mon
programme
ne crashe plus (!). Sachant que mon programme fait de l'ordre de 5
additions de floats pour trouver ces couts, et que les grandeurs
manipulees
sont de l'ordre de [0.1 -- 10.0], a partir de quelle valeur
d'EPSILON_FLOAT
je dois considerer qu'en fait il s'agit d'un probleme algorithmique
et pas
d'une erreur d'arrondi ?
Bonjour,
Mon code manipule des floats et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Vaut-il mieux tester le "signe" de la difference cout1 - cout2, ou
bien
comparer cout1 + EPSILON_FLOAT et cout2 ? (si cela fait une
quelconque
difference).
J'ai progressivement augmente EPSILON_FLOAT de facon a ce que mon
programme
ne crashe plus (!). Sachant que mon programme fait de l'ordre de 5
additions de floats pour trouver ces couts, et que les grandeurs
manipulees
sont de l'ordre de [0.1 -- 10.0], a partir de quelle valeur
d'EPSILON_FLOAT
je dois considerer qu'en fait il s'agit d'un probleme algorithmique
et pas
d'une erreur d'arrondi ?
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Ca veut dire que cout2 est plus grand que cout1. Il faut prendre la
valeur absolue et une solution utilisant la fonction double
fabs(double); dans math.h serait plus appropriée.
M'est d'avis que tu cherches trop de précision.
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Ca veut dire que cout2 est plus grand que cout1. Il faut prendre la
valeur absolue et une solution utilisant la fonction double
fabs(double); dans math.h serait plus appropriée.
M'est d'avis que tu cherches trop de précision.
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Ca veut dire que cout2 est plus grand que cout1. Il faut prendre la
valeur absolue et une solution utilisant la fonction double
fabs(double); dans math.h serait plus appropriée.
M'est d'avis que tu cherches trop de précision.
Bonjour,
Mon code manipule des floats et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Bonjour,
Mon code manipule des floats et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Bonjour,
Mon code manipule des floats et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Salut, et merci de ta/tes reponses. Je limite mes lignes a 70
caracteres parce que ton logiciel m'a salement detruit les miennes
:o)
| > > #define EPSILON_FLOAT 2e-6
| > > g_assert(cout1 - cout2 > -EPSILON_FLOAT);
| [...]
|
| J'ai été trop vite. Il se PEUT que cout2 soit plus grand que
cout1
| pour que l'assertion ci-dessus soit vraie. Mais ce n'est de toutes
| façons pas la bonne approche avec des flottants. Il faut raisonner
| en valeurs absolues.
Je vais avoir besoin de plus d'explications parce que je ne vois pas
comment. Mon raisonnement a ete :
1_ Je veux tester cout1 > cout2
2_ C.-a-d. cout1 - cout2 > 0
3_ On rend le test plus permissif : cout1 - cout2 > -0.0xxx1
Avec des valeurs aboslues, je ne vois pas.
| > M'est d'avis que tu cherches trop de précision.
Bien possible. J'ai pu trouver :
#define FLT_EPSILON 1.19209290e-07F
donc j'imagine qu'apres quelques operations, qui de temps en temps
ajoutent leurs erreurs au lieu de les compenser, on peut arriver a
une
erreur de 2e-6 sans que ce ne soit dramatique.
Salut, et merci de ta/tes reponses. Je limite mes lignes a 70
caracteres parce que ton logiciel m'a salement detruit les miennes
:o)
| > > #define EPSILON_FLOAT 2e-6
| > > g_assert(cout1 - cout2 > -EPSILON_FLOAT);
| [...]
|
| J'ai été trop vite. Il se PEUT que cout2 soit plus grand que
cout1
| pour que l'assertion ci-dessus soit vraie. Mais ce n'est de toutes
| façons pas la bonne approche avec des flottants. Il faut raisonner
| en valeurs absolues.
Je vais avoir besoin de plus d'explications parce que je ne vois pas
comment. Mon raisonnement a ete :
1_ Je veux tester cout1 > cout2
2_ C.-a-d. cout1 - cout2 > 0
3_ On rend le test plus permissif : cout1 - cout2 > -0.0xxx1
Avec des valeurs aboslues, je ne vois pas.
| > M'est d'avis que tu cherches trop de précision.
Bien possible. J'ai pu trouver :
#define FLT_EPSILON 1.19209290e-07F
donc j'imagine qu'apres quelques operations, qui de temps en temps
ajoutent leurs erreurs au lieu de les compenser, on peut arriver a
une
erreur de 2e-6 sans que ce ne soit dramatique.
Salut, et merci de ta/tes reponses. Je limite mes lignes a 70
caracteres parce que ton logiciel m'a salement detruit les miennes
:o)
| > > #define EPSILON_FLOAT 2e-6
| > > g_assert(cout1 - cout2 > -EPSILON_FLOAT);
| [...]
|
| J'ai été trop vite. Il se PEUT que cout2 soit plus grand que
cout1
| pour que l'assertion ci-dessus soit vraie. Mais ce n'est de toutes
| façons pas la bonne approche avec des flottants. Il faut raisonner
| en valeurs absolues.
Je vais avoir besoin de plus d'explications parce que je ne vois pas
comment. Mon raisonnement a ete :
1_ Je veux tester cout1 > cout2
2_ C.-a-d. cout1 - cout2 > 0
3_ On rend le test plus permissif : cout1 - cout2 > -0.0xxx1
Avec des valeurs aboslues, je ne vois pas.
| > M'est d'avis que tu cherches trop de précision.
Bien possible. J'ai pu trouver :
#define FLT_EPSILON 1.19209290e-07F
donc j'imagine qu'apres quelques operations, qui de temps en temps
ajoutent leurs erreurs au lieu de les compenser, on peut arriver a
une
erreur de 2e-6 sans que ce ne soit dramatique.
Salut, et merci de ta/tes reponses. Je limite mes lignes a 70
caracteres parce que ton logiciel m'a salement detruit les miennes
:o)
| > > #define EPSILON_FLOAT 2e-6
| > > g_assert(cout1 - cout2 > -EPSILON_FLOAT);
| [...]
|
| J'ai été trop vite. Il se PEUT que cout2 soit plus grand que
cout1| pour que l'assertion ci-dessus soit vraie. Mais ce n'est de
toutes
| façons pas la bonne approche avec des flottants. Il faut
raisonner
| en valeurs absolues.
Je vais avoir besoin de plus d'explications parce que je ne vois
pas
comment. Mon raisonnement a ete :
1_ Je veux tester cout1 > cout2
OK2_ C.-a-d. cout1 - cout2 > 0
OK (0.0, ce sont des flottants)
3_ On rend le test plus permissif : cout1 - cout2 > -0.0xxx1
Peut être trop permissif.
cout1 = 1e-7
cout2 = 2e-7
cout1-cout2 = -1e-7, ce qui est inférieur en valeur absolue au
quantum
FLT_EPSILON (cf plus bas, il vaut environ 1.2e-7). Le compilo va
considérer que ce sont les "mêmes" (la différence sera 0.0) et
l'assertion cout1-cout2>"valeur négative" sera vraie même si c'est
faux. C'est pour ça que ça ne va pas.Avec des valeurs aboslues, je ne vois pas.
C'est plus simple et tu es (a peu près) sûr de ne pas te tromper.
Tu
sais que tu pourras considérer 2 flottants égaux à partir du
moment
où la différence entre les deux n'excèdera pas une résolution
maximale (ou mini, ca dépend comment on le perçoit) fournie par
l'implémentation.| > M'est d'avis que tu cherches trop de précision.
Il est en fait plus probable que ce fut le contraire ;-), exemple en
appui.Bien possible. J'ai pu trouver :
#define FLT_EPSILON 1.19209290e-07F
donc j'imagine qu'apres quelques operations, qui de temps en temps
ajoutent leurs erreurs au lieu de les compenser, on peut arriver a
uneerreur de 2e-6 sans que ce ne soit dramatique.
C'est plus complexe que cela, ca dépend aussi de macros (voir
FLT_ROUNDS notamment tjs dans float.h). Arriver à une erreur de 2e-6
sur une variable par rapport à sa valeur initiale n'est en effet pas
bien difficile, mais savoir qu'une différence entre deux 2 variables
(en val. absolue) sera facilement supérieure à 2e-6 après moults
calculs l'est beaucoup moins.
Regis
Salut, et merci de ta/tes reponses. Je limite mes lignes a 70
caracteres parce que ton logiciel m'a salement detruit les miennes
:o)
| > > #define EPSILON_FLOAT 2e-6
| > > g_assert(cout1 - cout2 > -EPSILON_FLOAT);
| [...]
|
| J'ai été trop vite. Il se PEUT que cout2 soit plus grand que
cout1
| pour que l'assertion ci-dessus soit vraie. Mais ce n'est de
toutes
| façons pas la bonne approche avec des flottants. Il faut
raisonner
| en valeurs absolues.
Je vais avoir besoin de plus d'explications parce que je ne vois
pas
comment. Mon raisonnement a ete :
1_ Je veux tester cout1 > cout2
OK
2_ C.-a-d. cout1 - cout2 > 0
OK (0.0, ce sont des flottants)
3_ On rend le test plus permissif : cout1 - cout2 > -0.0xxx1
Peut être trop permissif.
cout1 = 1e-7
cout2 = 2e-7
cout1-cout2 = -1e-7, ce qui est inférieur en valeur absolue au
quantum
FLT_EPSILON (cf plus bas, il vaut environ 1.2e-7). Le compilo va
considérer que ce sont les "mêmes" (la différence sera 0.0) et
l'assertion cout1-cout2>"valeur négative" sera vraie même si c'est
faux. C'est pour ça que ça ne va pas.
Avec des valeurs aboslues, je ne vois pas.
C'est plus simple et tu es (a peu près) sûr de ne pas te tromper.
Tu
sais que tu pourras considérer 2 flottants égaux à partir du
moment
où la différence entre les deux n'excèdera pas une résolution
maximale (ou mini, ca dépend comment on le perçoit) fournie par
l'implémentation.
| > M'est d'avis que tu cherches trop de précision.
Il est en fait plus probable que ce fut le contraire ;-), exemple en
appui.
Bien possible. J'ai pu trouver :
#define FLT_EPSILON 1.19209290e-07F
donc j'imagine qu'apres quelques operations, qui de temps en temps
ajoutent leurs erreurs au lieu de les compenser, on peut arriver a
une
erreur de 2e-6 sans que ce ne soit dramatique.
C'est plus complexe que cela, ca dépend aussi de macros (voir
FLT_ROUNDS notamment tjs dans float.h). Arriver à une erreur de 2e-6
sur une variable par rapport à sa valeur initiale n'est en effet pas
bien difficile, mais savoir qu'une différence entre deux 2 variables
(en val. absolue) sera facilement supérieure à 2e-6 après moults
calculs l'est beaucoup moins.
Regis
Salut, et merci de ta/tes reponses. Je limite mes lignes a 70
caracteres parce que ton logiciel m'a salement detruit les miennes
:o)
| > > #define EPSILON_FLOAT 2e-6
| > > g_assert(cout1 - cout2 > -EPSILON_FLOAT);
| [...]
|
| J'ai été trop vite. Il se PEUT que cout2 soit plus grand que
cout1| pour que l'assertion ci-dessus soit vraie. Mais ce n'est de
toutes
| façons pas la bonne approche avec des flottants. Il faut
raisonner
| en valeurs absolues.
Je vais avoir besoin de plus d'explications parce que je ne vois
pas
comment. Mon raisonnement a ete :
1_ Je veux tester cout1 > cout2
OK2_ C.-a-d. cout1 - cout2 > 0
OK (0.0, ce sont des flottants)
3_ On rend le test plus permissif : cout1 - cout2 > -0.0xxx1
Peut être trop permissif.
cout1 = 1e-7
cout2 = 2e-7
cout1-cout2 = -1e-7, ce qui est inférieur en valeur absolue au
quantum
FLT_EPSILON (cf plus bas, il vaut environ 1.2e-7). Le compilo va
considérer que ce sont les "mêmes" (la différence sera 0.0) et
l'assertion cout1-cout2>"valeur négative" sera vraie même si c'est
faux. C'est pour ça que ça ne va pas.Avec des valeurs aboslues, je ne vois pas.
C'est plus simple et tu es (a peu près) sûr de ne pas te tromper.
Tu
sais que tu pourras considérer 2 flottants égaux à partir du
moment
où la différence entre les deux n'excèdera pas une résolution
maximale (ou mini, ca dépend comment on le perçoit) fournie par
l'implémentation.| > M'est d'avis que tu cherches trop de précision.
Il est en fait plus probable que ce fut le contraire ;-), exemple en
appui.Bien possible. J'ai pu trouver :
#define FLT_EPSILON 1.19209290e-07F
donc j'imagine qu'apres quelques operations, qui de temps en temps
ajoutent leurs erreurs au lieu de les compenser, on peut arriver a
uneerreur de 2e-6 sans que ce ne soit dramatique.
C'est plus complexe que cela, ca dépend aussi de macros (voir
FLT_ROUNDS notamment tjs dans float.h). Arriver à une erreur de 2e-6
sur une variable par rapport à sa valeur initiale n'est en effet pas
bien difficile, mais savoir qu'une différence entre deux 2 variables
(en val. absolue) sera facilement supérieure à 2e-6 après moults
calculs l'est beaucoup moins.
Regis
Mon code manipule des floats
et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Vaut-il mieux tester le "signe" de la difference cout1 -
cout2, ou bien comparer cout1 + EPSILON_FLOAT et cout2 ?
(si cela fait une quelconque difference).
J'ai progressivement augmente EPSILON_FLOAT de facon a ce
que mon programme ne crashe plus (!). Sachant que mon
programme fait de l'ordre de 5 additions de floats pour
trouver ces couts, et que les grandeurs manipulees sont de
l'ordre de [0.1 -- 10.0], a partir de quelle valeur
d'EPSILON_FLOAT je dois considerer qu'en fait il s'agit
d'un probleme algorithmique et pas d'une erreur d'arrondi?
Mon code manipule des floats
et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Vaut-il mieux tester le "signe" de la difference cout1 -
cout2, ou bien comparer cout1 + EPSILON_FLOAT et cout2 ?
(si cela fait une quelconque difference).
J'ai progressivement augmente EPSILON_FLOAT de facon a ce
que mon programme ne crashe plus (!). Sachant que mon
programme fait de l'ordre de 5 additions de floats pour
trouver ces couts, et que les grandeurs manipulees sont de
l'ordre de [0.1 -- 10.0], a partir de quelle valeur
d'EPSILON_FLOAT je dois considerer qu'en fait il s'agit
d'un probleme algorithmique et pas d'une erreur d'arrondi?
Mon code manipule des floats
et contient quelques assertions du type
g_assert(cout1 > cout2);
A cause des inevitables erreurs d'arrondis, j'ecris en fait :
#define EPSILON_FLOAT 2e-6
g_assert(cout1 - cout2 > -EPSILON_FLOAT);
Vaut-il mieux tester le "signe" de la difference cout1 -
cout2, ou bien comparer cout1 + EPSILON_FLOAT et cout2 ?
(si cela fait une quelconque difference).
J'ai progressivement augmente EPSILON_FLOAT de facon a ce
que mon programme ne crashe plus (!). Sachant que mon
programme fait de l'ordre de 5 additions de floats pour
trouver ces couts, et que les grandeurs manipulees sont de
l'ordre de [0.1 -- 10.0], a partir de quelle valeur
d'EPSILON_FLOAT je dois considerer qu'en fait il s'agit
d'un probleme algorithmique et pas d'une erreur d'arrondi?
Mon code manipule des floats et contient quelques assertions du type
<...>
#define EPSILON_FLOAT 2e-6
Mon code manipule des floats et contient quelques assertions du type
<...>
#define EPSILON_FLOAT 2e-6
Mon code manipule des floats et contient quelques assertions du type
<...>
#define EPSILON_FLOAT 2e-6
Bonjour,
Pour revenir sur le principe de faire des calculs sur des doubles,
j'ai
essaye de passer les types de "delta" et "tmp" de float a double,
sans
aucune amelioration de la precision. Je ne comprends pas pourquoi. En
revanche, utiliser des doubles pour les totaux finaux font gagner en
precision un facteur 100. Hmm...
PJ: rounding.c
Compilation: gcc -W -Wall -o rounding rounding.c
Execution:
3.219389e+01 != 3.219388e+01 (diff = 3.814697e-06 = 32.00 *
FLT_EPSILON)
1.018313e+00 == 1.018313e+00 (diff = 1.986821e-08 < FLT_EPSILON =
1.192093e-07)
Bonjour,
Pour revenir sur le principe de faire des calculs sur des doubles,
j'ai
essaye de passer les types de "delta" et "tmp" de float a double,
sans
aucune amelioration de la precision. Je ne comprends pas pourquoi. En
revanche, utiliser des doubles pour les totaux finaux font gagner en
precision un facteur 100. Hmm...
PJ: rounding.c
Compilation: gcc -W -Wall -o rounding rounding.c
Execution:
3.219389e+01 != 3.219388e+01 (diff = 3.814697e-06 = 32.00 *
FLT_EPSILON)
1.018313e+00 == 1.018313e+00 (diff = 1.986821e-08 < FLT_EPSILON =
1.192093e-07)
Bonjour,
Pour revenir sur le principe de faire des calculs sur des doubles,
j'ai
essaye de passer les types de "delta" et "tmp" de float a double,
sans
aucune amelioration de la precision. Je ne comprends pas pourquoi. En
revanche, utiliser des doubles pour les totaux finaux font gagner en
precision un facteur 100. Hmm...
PJ: rounding.c
Compilation: gcc -W -Wall -o rounding rounding.c
Execution:
3.219389e+01 != 3.219388e+01 (diff = 3.814697e-06 = 32.00 *
FLT_EPSILON)
1.018313e+00 == 1.018313e+00 (diff = 1.986821e-08 < FLT_EPSILON =
1.192093e-07)