RACINES D'UNE EQUATION DU SECOND DEGRÉ

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 31 oct. 2007 à 17:44
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 31 oct. 2007 à 20:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44556-racines-d-une-equation-du-second-degre

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
31 oct. 2007 à 20:21
ok
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
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és 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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és 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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és 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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és 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Derniè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és 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
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
Rejoignez-nous