COMPARAISON ENTRE FLOTTANTS

NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008 - 1 nov. 2007 à 00:29
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 1 nov. 2007 à 20:58
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/44566-comparaison-entre-flottants

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 20:58
non c'est bon vous pouvez supprimer, ma derniere source est plus "edifiante" !
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
1 nov. 2007 à 20:43
Faut pas paniquer :P La loi de CS n'est pas gravée dans la pierre, si l'auteur, ou quelqu'un d'autre, croit avoir une bonne raison de laisser sa source on est ouvert à ça, c'est en partie pour ça qu'on poste un commentaire d'explication dans la source avec délai de quelques heures. Mais bon avec l'exemple elle va surement rester, Brunews dira ce qu'il en pense.

A+
metanil Messages postés 51 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 13 novembre 2007
1 nov. 2007 à 20:36
C'est pour ça que ce sont bien 2 languages différents. D'ailleurs il y a une option du compilo qui permets de traiter certaines instructions comme le C le ferait !

Pour rester dans le constructif, et pour ceux que cela interresse, un article, en anglais, qui traite de ce sujet (je l'ai eu par un ancien pote de chez Borland), et propose en substance le stockage des grands nombres dans un flux dît binaire...

http://www.thescripts.com/forum/thread138508.html

metanil
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 19:34
c'est bon j'ai un bon exemple... il est fini mais j'ai faim, alors
je le mettrais dans moins d'une heure... c'est concluant !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 nov. 2007 à 19:29
"et c'est quoi, ça, sinon le boulot que fait '==(a,b)'"
Dans le cadre du C++, il est clair qu'on peut écrire une fonction qui sera appelée quand le compilo verra == entre 2 objets.
Pour autant == dans son emploi normal en C n'a absolument rien d'une fonction, c'est un simple opérateur de comparaison dont le compilo mettra illico l'instruction asm (fcomp ou comisd ou ...). C'est codé en dur dans le CPU ou la FPU, aucun sous-programme d'appelé. On peut aisément le vérifier en regardant le listing asm du compilo, aucun jmp vers un bloc de code finissant par 'ret xxx'.
metanil Messages postés 51 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 13 novembre 2007
1 nov. 2007 à 17:27
sinon, on a qu'à tous se mettre à l'anglais !
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 17:22
je ne mets jamais d'accent car parfois ils ne passent pas, alors
par habitude je les squeeze


^^
metanil Messages postés 51 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 13 novembre 2007
1 nov. 2007 à 17:17
J'écoute de la musique en même temps, alors rythme rithme...c'est pas la même muse ?

lol

fait quand même gaffe aux accents.....
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 17:12
ent <=> es

;-)
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 17:07
moi je suis pas tres regardant sur les fautes d'orthographe...
par contre j'ai en horreur la faute algorYthme, c'est algorIthme !

en fait je ne voulais pas parler de grands nombres, je parle
de grandes sommes, ie sommer des milliers de termes par exemple avec
une somme ou les termes ne sont pas tous comparablent, ce qui n'a
rien avoir avec un pentium core duo, car ce problement est intrinseque
a la gestion des nombres flottants... donc on aura beau avoir des
"long long long double" que le probleme persisterait (mais alors
il faudrait des plus grandes sommes)
The Incredible Godzy Messages postés 10 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 29 septembre 2008
1 nov. 2007 à 17:06
C'est très amusant de voir comment la discussion est partie en sucette sur quand même pas grand chose...

Je ne trouvais pas la source de JCDjcd complètement stupéfiante à la base, mais elle a le mérite de poser le problème clairement. Bien sur, les gens qui se trouvent confrontés aux problèmes d'arrondis ont, en général, réfléchis au problème avant d'écrire des bêtises sur leur écran. Mais pour un étudiant qui programme "vite-fait", et qui n'a pas un professeur super au taquet, ça peut quand même être utile!
metanil Messages postés 51 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 13 novembre 2007
1 nov. 2007 à 16:56
Je crois qu'il existe des algorythmes de calcul de sommes de grands nombres, mais ils ne fonctionnent pas avec PI !

D'un autre côté, s'il faut avoir fait Math Sup et Math Spé pour correctement sommer deux nombres, ça vaut pas le coup d'acheter un pentium core duo ...
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 16:51
Bon ok, j'avoue que c'est pas tres utile, j'abdique sans condition,
de toute maniere j'avais fait cela en 10min...

Mais je persiste (je suis tetu comme gars ^^) a croire que ce sujet
est passionnant : un exemple concret si vous le voulez bien :
quand on a une grande somme a calculer, alors il FAUT trier tous les
termes et commencer par sommer les petits jusqu'aux grands, pour
justement minimiser les erreurs d'arrondis !!
Bon c'est pas tres parlant... si je trouve un exemple de programme
a faire pour vous montre la difference, je le ferais ! (faut que
je reflechisse un peu ... peut-etre ma prochaine source...)
metanil Messages postés 51 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 13 novembre 2007
1 nov. 2007 à 16:45
Dans l'implémentation du langugae C++, '==' est une fonction !

"On appelle fonction un sous-programme qui permet d'effectuer un ensemble d'instructions par simple appel de la fonction dans le corps du programme principal. Les fonctions permettent d'exécuter dans plusieurs parties du programme une série d'instructions, cela permet une simplicité du code et donc une taille de programme minimale. D'autre part, une fonction peut faire appel à elle-même, on parle alors de fonction récursive (il ne faut pas oublier de mettre une condition de sortie au risque sinon de ne pas pouvoir arrêter le programme...). " et c'est quoi, ça, sinon le boulot que fait '==(a,b)' bit à bit sur deux emplacements mémoires ?


Metanil
Cyberboy2054 Messages postés 173 Date d'inscription jeudi 20 décembre 2001 Statut Membre Dernière intervention 22 août 2008
1 nov. 2007 à 16:36
Metanil tu reflechis trop.
Il n'a nulle part été question de comparaison d'objets mais de float. Ensuite appeler des float des non objets... si ca t'amuse,apres tout pourquoi pas. Toujours est il qu'ils peuvent etre égaux dans la representation que l'on utilise (mantisse/exposant), il faut simplement faire attention aux erreurs d'arrondis.

Pour la suite je sais pas dans quoi tu pars, cela n'a rien a voir avec la discussion qui nous occupe, mais == est un operateur (de la forme A operateur B), que l'on peut surcharger dans des fonctions... mais ce n'est pas une fonction au sens strict (type nom(parametre1, ..., parametreN)). Mais bon ce n'est qu'une question de vocabulaire.

Au passage, "D'ailleurs printf, ce n'est pas du C++ !" est bien dans l'idée de JCDjcd... seulement du C
metanil Messages postés 51 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 13 novembre 2007
1 nov. 2007 à 14:55
Il me semble que la comparaison entre deux objets est plus du resort du C++ que la comparaison entre deux "flottants"... qui ne sont pas des objets : deux non-objets peuvent-ils être égaux ?

Remarque : entre 1 et 0, qui sont les deux positions dominantes en informatique, je ne voit pas de flottants.

D'autre part, tu dis n'utiliser aucune fonctions de la librairie du C++. OR '==' en est une, de fonction !

Peut-être un passage par les nobres complexes t'aiderait-il ?

D'ailleurs printf, ce n'est pas du C++ !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 nov. 2007 à 12:08
http://msdn2.microsoft.com/en-us/library/0b34tf65(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/c151dt3s(VS.80).aspx

Du calme tout le monde, il faut se méfier des "jamais" comme de la peste. Il y a énormément de nombres pouvant de représenter en flottant64 avec parfaite précision et l'égalité est tout à fait concevable dans ces cas.

Faisons abstraction de ceux ayant lu trop vite et donc compris à l'envers, ça m'arrive aussi.

JCDjcd > Faut bien avouer que cette source n'apporte pas grand chose en terme de prog, voila pourquoi elle ne restera pas en l'état. Si tu veux en faire un tuto étoffé sur les flottants (représentation binaire) alors je la garderai bien volontiers.
Stp, ne compare pas tes productions aux genres de daube que tu cites plus haut, ça n'a été conservé que par pitié et ça n'a d'autre utilité que de monter ce qu'il est inutile de reproduire.

Bon week end à tous.
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 10:38
heu... il doit y avoir une mesentente : JUSTEMENT cette source fait reference
a la tres classique erreur de comparaison float==float, je demontre justement
que cela n'a aucun sens, et au passage que l'associativite n'existe par en
float (ou en double)...

en ce qui concerne la charte, je viole peut-etre la charte sur les points
suivants (c'est discutable a mon avis) :
regle #2 : en meme temps je n'utilise aucune fonction standard
regle #3 : mais le titre a ete gentillement modifie
regle #9 : quelques fautes d'orthographe se sont glissees
gamemonde Messages postés 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
1 nov. 2007 à 10:26
ou est lapprentisage ici on ne garde pas un programme ou il y a un erreur c'est ecrit dans la charte ici l'erreur est grave jamais de validation float == float
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
1 nov. 2007 à 09:47
C'est pas les sources les plus simples qui encombrent ce site...
Mais ceci est un exemple sur les doubles, sur les pieges a eviter !

C'est instructif, donc moi je serais pour la laisser cette source !
C'est simple, et c'est tres grave ?

Je croyais que le motif principal d'un retrait de source etait la
redondance, or je crois pas avoir fait de le copie de quoi que ce
soit... et surtout je pourrais comprendre la raison du retrait
comme l'inutilite, mais je crois sincerement que c'est tres utile,
mais ceci reste mon avis, la decision ne m'appartient pas ^^
(la source est serieuse, je traite d'un vrai probleme !!)


Au passage si vous supprimez cette source, faites-en de meme avec
je sais pas moi par exemple http://www.cppfrance.com/codes/CALCUL-VOTRE-POIDS-IDEAL_11311.aspx
Parceque dans son genre il est pas mal du tout ...
(j'ai pris cette source au hasard, mais apparement elle est tres populaire,
je pourrais en citer beaucoup d'autres ...)
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
1 nov. 2007 à 09:36
purée c'est super mal fichu le nouveau système de notation :evil:
shenron666 Messages postés 229 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 20 août 2014
1 nov. 2007 à 09:33
on ne teste JAMAIS une égalité entre 2 flottants à cause des "problèmes" d'imprécision
pour comparer l'égalité entre 2 flottants on fait
si (fabs(a-b) < epsilon) alors égalité
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
1 nov. 2007 à 04:27
Je vais le laisser la jusqu'a demain parrce que je supose que tu veux que les gens voient ton travail et que sa suit une conversation précédente, mais ensuite je la retire car le code est vraiment trop simple :P
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
1 nov. 2007 à 00:29
Résultat logique...

Règle numéro 1 : Manier des quantités ayant des valeurs absolues proches.
Une opération sur un nombre très petit et un nombre très grand provoque des erreurs d'arrondi.

Dans ton code :
a et b très petit par rapport à c donc forcement erreur d'arrondi.

Règle numéro 2 : La précision diminue plus la valeur absolue augmente.

Si on suit les règles comparer a avec b avec pour chacun une valeur absolu proche a du sens.
Comparer a avec b avec pour chacun des valeurs absolu très différente n'a pas de sens.

Ceci dit un programmeur qui ecrit : if (x == y) c'est grave surtout si il connait les regles !
Rejoignez-nous