cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 31 oct. 2007 à 20:21
ok
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 31 oct. 2007 à 20:14
Petite rectification pour JCDjcd :)
Le terme "flottant" est propre au C/C++, dans d'autres langages, c'est "real". Je préfère de loin le terme "réel" mais c'est du détail.
Donc bref "real = flottant (ou double)", mais le problème reste le meme.
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 31 oct. 2007 à 19:30
mais je crois que l'on est parfaitement d'accord :
moi je propose seulement que le teste a==0 doit etre
remplacer par a < 1e-8 && a > -1e-8 par exemple, et ceci
empeche bien toute division par zero car aux dernieres
nouvelles a=0. passe le teste !
d'ailleurs je suis le premier a raler quand dans une source
sur les calculatrices, l'auteur de teste pas la division
par zero...
de toute maniere un programme avec une injurebox (^^) a l'ecran
doit etre considere comme un programme bugge !
petite rectification pour luhtor : flottant != reel !!! tout
mon propos est ici, dans cette (subtile?) difference
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 31 oct. 2007 à 19:22
L'égalité de réel est correcte, faut juste savoir ce que l'on fait.
Il n'y pas de cas général. Il peut arriver qu'une comparaison de réels (bit à bit) suffisent. Meme si dans son cas, on est d'accord, c'est pas correct.
Donc en toute rigueur, "l'egalite entre flottant n'existe pas" => c'est pas si simple.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 31 oct. 2007 à 19:03
C'est ce que j'appelais 'cerner' une valeur et on est bien d'accord.
Pour autant j'insiste qu'on doit absolument tester le 0 FULL avant de diviser si on ne veut pas d'injurebox à l'écran.
"si a = 1e-200 alors la clause a==0 est fausse"
bien entendu 1e-200 n'est pas ==0.0f et donc pas d'exception.
Par contre le 0 existe et sous 2 formes en flottants, -0 et +0. Sur un float (32 bit) c'est le bit 31 (le dernier) qui donne le signe mais quel que soit le signe:
if(a == 0.0f) sera évalué correctement à tout coup.
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 31 oct. 2007 à 18:43
mais moi je dis que si a = epsilon/2, alors on doit le considerer comme nul
i.e. que l'equation n'est pas du second degre.
de toute maniere le resultat sera de l'ordre de 1/epsilon (procher de +infini quoi !)
je suis desolé mais si a = 1e-200 alors la clause a==0 est fausse
tout ca pour dire que si un jour quelqu'un s'amuse a faire de boucle
genre while(a != 0.) (avec a flotant bien sur) il aura quelques suprises
par habitude il faut savoir que l'ensemble des flotants en C/C++
n'est pas un corps ! donc le teste de nullite n'est pas le ==0.
mais bien <=+eps et >=-eps
moi je dis ca juste pour eviter quelques suprises bien connues de mes services !
est-ce-que quelqu'un peut m'expliquer que veux dire le ==0. dans les flottants,
moi personnellement je trouve aucun sens a donner a ca (en sachant bien ce que
l'on manipule)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 31 oct. 2007 à 18:31
JCDjcd > Attention que ta remarque est valable si on cherche à cerner une valeur mais dans le cas d'un diviseur il faut absolument tester 0 sinon exception. Le 0 se teste d'ailleurs parfaitement bien.
Faisons le cas d'un float en xmm0:
xorps xmm1, xmm1
ucomiss xmm0, xmm1
je short divZERO
Comme dit plus haut par MAX12, cette source sera enlevée en soirée.
cs_max12
Messages postés1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDernière intervention 7 juillet 2014 31 oct. 2007 à 18:02
Ce code existe déjà en plusieurs millions d'exemplaires et ces calculs sont très simple à réaliser. Cette source n'apporte pas assez de nouveau, je ne peux donc pas la garder.
A+
cs_JCDjcd
Messages postés1138Date d'inscriptionmardi 10 juin 2003StatutMembreDernière intervention25 janvier 20094 31 oct. 2007 à 17:44
mais c'est n'importe quoi !
les testes genre "if(a==0)" avec la variable flottante
n'ont aucun sens, l'egalite entre flottant n'existe pas !
il faut te fixer un epsilon et comparer les nombres de la
facon suivante : a et b sont dit egaux si la valeur
absolue de leur difference est plus petite ou egale a
cet epsilon
31 oct. 2007 à 20:21
31 oct. 2007 à 20:14
Le terme "flottant" est propre au C/C++, dans d'autres langages, c'est "real". Je préfère de loin le terme "réel" mais c'est du détail.
Donc bref "real = flottant (ou double)", mais le problème reste le meme.
31 oct. 2007 à 19:30
moi je propose seulement que le teste a==0 doit etre
remplacer par a < 1e-8 && a > -1e-8 par exemple, et ceci
empeche bien toute division par zero car aux dernieres
nouvelles a=0. passe le teste !
d'ailleurs je suis le premier a raler quand dans une source
sur les calculatrices, l'auteur de teste pas la division
par zero...
de toute maniere un programme avec une injurebox (^^) a l'ecran
doit etre considere comme un programme bugge !
petite rectification pour luhtor : flottant != reel !!! tout
mon propos est ici, dans cette (subtile?) difference
31 oct. 2007 à 19:22
Il n'y pas de cas général. Il peut arriver qu'une comparaison de réels (bit à bit) suffisent. Meme si dans son cas, on est d'accord, c'est pas correct.
Donc en toute rigueur, "l'egalite entre flottant n'existe pas" => c'est pas si simple.
31 oct. 2007 à 19:03
Pour autant j'insiste qu'on doit absolument tester le 0 FULL avant de diviser si on ne veut pas d'injurebox à l'écran.
"si a = 1e-200 alors la clause a==0 est fausse"
bien entendu 1e-200 n'est pas ==0.0f et donc pas d'exception.
Par contre le 0 existe et sous 2 formes en flottants, -0 et +0. Sur un float (32 bit) c'est le bit 31 (le dernier) qui donne le signe mais quel que soit le signe:
if(a == 0.0f) sera évalué correctement à tout coup.
31 oct. 2007 à 18:43
i.e. que l'equation n'est pas du second degre.
de toute maniere le resultat sera de l'ordre de 1/epsilon (procher de +infini quoi !)
je suis desolé mais si a = 1e-200 alors la clause a==0 est fausse
tout ca pour dire que si un jour quelqu'un s'amuse a faire de boucle
genre while(a != 0.) (avec a flotant bien sur) il aura quelques suprises
par habitude il faut savoir que l'ensemble des flotants en C/C++
n'est pas un corps ! donc le teste de nullite n'est pas le ==0.
mais bien <=+eps et >=-eps
moi je dis ca juste pour eviter quelques suprises bien connues de mes services !
est-ce-que quelqu'un peut m'expliquer que veux dire le ==0. dans les flottants,
moi personnellement je trouve aucun sens a donner a ca (en sachant bien ce que
l'on manipule)
31 oct. 2007 à 18:31
Faisons le cas d'un float en xmm0:
xorps xmm1, xmm1
ucomiss xmm0, xmm1
je short divZERO
Comme dit plus haut par MAX12, cette source sera enlevée en soirée.
31 oct. 2007 à 18:02
A+
31 oct. 2007 à 17:44
les testes genre "if(a==0)" avec la variable flottante
n'ont aucun sens, l'egalite entre flottant n'existe pas !
il faut te fixer un epsilon et comparer les nombres de la
facon suivante : a et b sont dit egaux si la valeur
absolue de leur difference est plus petite ou egale a
cet epsilon