Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comparaison de flottants

209 réponses
Avatar
Emmanuel
bonjour tout le monde,

une question de vrai débutant :

Avec le programme essai.c suivant

int main(void) {
return ((1.7 + 0.1) == 1.8) ? 1 : 0;
}

j'obtiens :

$ gcc -Wall -o essai essai.c; ./essai; echo $?
1

Avec le programme essai.c suivant

int main(void) {
float x;
x = 1.7;
return ((x + 0.1) == 1.8) ? 1 : 0;
}

j'obtiens :

$ gcc -Wall -o essai essai.c; ./essai; echo $?
0

Pourtant, le programme

#include <stdio.h>
int main(void) {
float x;
x = 1.7;
printf("%f et %f\n", 1.7 + 0.1, x + 0.1);
}

affiche :
1.800000 et 1.800000

Apparremment, 1.7+0.1 et x+0.1 sont égaux ; j'imagine qu'il s'agit d'un
problème de représentation des flottants en machine mais j'aimerais bien
avoir une confirmation ou une infirmation (et une explication, si possible).

Merci par avance.

Emmanuel

10 réponses

Avatar
Benoit Izac
Bonjour,

le 05/04/2010 à 17:22, Marc Espie a écrit dans le message
<hpcv7l$31ho$ :

(bon, a cote, usenet is dying, c'est pas les 3 dinosaures qui trainent
encore ici qui vont se faire avoir...)



Détrompe toi, il y a toujours des gens qui lurk^Wlisent (même s'ils ne
comprennent pas tout).

--
Benoit Izac
Avatar
Erwan David
Samuel DEVULDER écrivait :

Marc Espie a écrit :

Sam, arrete de raconter n'importe quoi. Vincent a raison.



Il a raison? C'est pas moi qui dit que jetter quoi que ce soit. Les
docs dispo parlent d'exposant décimal dans le format du printf du
%p.. pas binaire. Et comme ca colle pas avec ce qu'il dit il jette
sans explication. Il ne faut pas abuser là quand même.



Des docs avec erreur il y en a plein. Par contre la norme ISO de C c'est
la définition. DOnc en cas de doute c'est elle qui fait foi. Et Vincent
te conseille de regarder cette norme.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
espie
In article <hpd2o5$he0$,
Benoit Izac wrote:
Bonjour,

le 05/04/2010 à 17:22, Marc Espie a écrit dans le message
<hpcv7l$31ho$ :

(bon, a cote, usenet is dying, c'est pas les 3 dinosaures qui trainent
encore ici qui vont se faire avoir...)



Détrompe toi, il y a toujours des gens qui lurk^Wlisent (même s'ils ne
comprennent pas tout).



Chouette, mon piege a (semi)lurkers a fonctionne :)
Avatar
Manuel Pégourié-Gonnard
Samuel DEVULDER scripsit :

Marc Espie a écrit :
Tu te trompes. Je suis encore la.





Moi aussi, si ça a la moindre importance.

Je salue ton courage, bien que je pense que ce thread ne t'apprends pas
grand chose, sauf peut être étudier comment deux grand c*ns peuvent se
batte indéfiniment sur des futilités bien éloignées du pb original.



En ce qui me concerne, j'ai beaucoup plus à apprendre que Marc sur le
C (et c'est un euphémisme), et après quelques années à fréquenter
Usenet, ça ne m'amuse déjà plus du tout de voir comment les gens s'y
engueulent. Je continue à lire ce fil simplement parce qu'au milieu de
tout le bruit lassant des disputes se cachent parfois quelques
informations sur le C, que je suis content de pouvoir lire, même si je
préférerais ne pas avoir à me farcir les guerres personnelles pour ça.

Pour la norme C, tu ne peux pas l'obtenir gratuitement de facon legale.
Tu peux trouver un brouillon quasi-final:
http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf
ainsi que le rationale:
http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf



Merci à toi. Dommage qu'il faille passer par quelqu'un d'autre pour
avoir des infos précises.



L'information se trouve dans la FAQ du groupe...

http://www.levenez.com/lang/c/faq/fclc003.html#q_10

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Avatar
Vivien MOREAU
On 2010-04-05, Benoit Izac wrote:

Détrompe toi, il y a toujours des gens qui lurk^Wlisent (même s'ils ne
comprennent pas tout).



Tout à fait. Un jour, je serais grand. ;-)

--
Unix is simple. It just takes a genius to understand its simplicity
--Dennis M. Ritchie
Avatar
Samuel DEVULDER
Manuel Pégourié-Gonnard a écrit :

En ce qui me concerne, j'ai beaucoup plus à apprendre que Marc sur le
C (et c'est un euphémisme), et après quelques années à fréquenter
Usenet, ça ne m'amuse déjà plus du tout de voir comment les gens s'y
engueulent. Je continue à lire ce fil simplement parce qu'au milieu de
tout le bruit lassant des disputes se cachent parfois quelques
informations sur le C, que je suis content de pouvoir lire, même si je
préférerais ne pas avoir à me farcir les guerres personnelles pour ça.



Je compatis. En même temps, on peut se demander si le thread n'avait pas
pris cet aspect "c'est moi le chef qui connait le grand livre alors tais
toi", si donc on aurait eu plus d'infos sur les flottants et leurs
variantes[*]. C'est que certains ne sont pas très prolixe en
explications, et ne sont même pas manifestés en réponse au post
originel. Dommage, il semblerait que les querelles sont la seule chose
qui les réveille.
___
[*] decimal64, affichage %a et ses bizarreries (sa sortie n'est pas
prévisibles entre 2 machines/os/libc distinctes, ce qui le rend d'un
usage délicat), etc.

Pour la norme C, tu ne peux pas l'obtenir gratuitement de facon legale.
Tu peux trouver un brouillon quasi-final:
http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1124.pdf
ainsi que le rationale:
http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf


Merci à toi. Dommage qu'il faille passer par quelqu'un d'autre pour
avoir des infos précises.



L'information se trouve dans la FAQ du groupe...



C'est pas assez précis. Dire "c'est dans la norme" (et ses 124xyz pages)
n'est pas satisfaisant et a des allures de "sortie du chapeau". Bien
souvent une explication indiquant la raison de pourquoi la norme impose
ceci ou cela sera de loin profitable. Si on ne veut pas détailler
l'explication par manque de temps ou parce qu'on l'a déjà écrite ou lue
ailleurs, il ne coute rien de placer l'url de cette référence dans son
message et pas un lacunaire "ce code est faux.", "c'est un bug.", etc
(cf toutes les formules à l'emporte pièce qu'on a trouvé dans ce fil de
discussion).

sam.
Avatar
Samuel DEVULDER
Marc Espie a écrit :
In article <4bb9fabd$0$22486$,
Samuel DEVULDER wrote:
Jean-Marc Bourguet a écrit :
Samuel DEVULDER writes:

Vincent Lefevre a écrit :

Moi j'en parle: ton code avec long int n'est pas portable, et


Rahala... D'où sors tu que cet exemple voulait être portable?


Quel est l'intérêt à écrire du code non portable quand du code portable
est tout aussi aisé à écrire?


Si on veut. Mais je ne fais pas cet effort pour un exemple jouet. C'est
pas une refonte de COQ ce code. (http://www.lix.polytechnique.fr/coq/)



A cote de ca, ce newsgroup est quand meme un peu une vitrine. Si on laisse
passer des erreurs, meme dans des exemples jouets, les gens qui passent par la
risquent de prendre ces erreurs comme argent comptant.



C'est pas faux. Mais je dirais à ces gens que les codes C qu'on trouve
ici ou là sont l'équivalent d'un dessin en géométrie. Ca fixe les idées
et aide à réfléchir, et cela même si le code est pas 100% exact. La
programmation c'est quand même autre chose que de recopier aveuglément
des bouts de codes en espérant que ça va marcher sans qu'on y ait
réfléchit un minimum avant. En programmation comme en géométrie, il faut
savoir raisonner juste sur une figure fausse.

Il y a deja
suffisamment de mauvais exemples de code C dans la nature, c'est peut-etre pas
necessaire d'en rajouter...



Si on veut oui. En même temps est-ce que c'est grave des codes "un peu
faux" (en apparence). Tout n'est pas binaire, même en informatique. Au
lieu de dire "c'est faux", certains pourraient proposer des corrections
pour rendre le truc plus conforme à la norme. Mais c'est un exercice que
je ne ferais pas pour un exemple jouet à usage unique.

(bon, a cote, usenet is dying, c'est pas les 3 dinosaures qui trainent encore
ici qui vont se faire avoir...)



La question qui me vient immédiatement est: est-ce que ca meurt parce
qu'il y a mieux ailleurs ou parce que le comportement intégriste a fait
fuir les bonnes volontés? Cela dit, visiblement il y a quand même un peu
de monde qui lit. Peut être qu'ils vont sortir et poster un peu. Ca
changera des 3 piliers de (foo)bar^Wgroupe dont tu fais référence.

sam.
Avatar
Manuel Pégourié-Gonnard
Samuel DEVULDER scripsit :

C'est pas faux. Mais je dirais à ces gens que les codes C qu'on trouve
ici ou là sont l'équivalent d'un dessin en géométrie. Ca fixe les idées
et aide à réfléchir, et cela même si le code est pas 100% exact. La
programmation c'est quand même autre chose que de recopier aveuglément
des bouts de codes en espérant que ça va marcher sans qu'on y ait
réfléchit un minimum avant. En programmation comme en géométrie, il faut
savoir raisonner juste sur une figure fausse.



Ton analogie me semble erronée. Il me semble que faire lire aux gens du
code médiocre (pour ne pas dire faux, histoire de rester nuauncé) en
s'attendant à ce qu'ils pondent du code meilleur, c'est plutôt comme si
un cours de maths contenait des pseudo-démonstrations approximatives,
et qu'on demande ensuite aux étudiants de faire des vraies
démonstrations rigoureuses sur leurs copies.

L'expérience prouve que quand une personne en phase d'apprentissage
reproduit ce qu'elle a vu, c'est généralement avec une baisse (plutôt
qu'une hausse) de qualité. Il faut donc mieux que le matériel pris comme
exemple soit aussi irréprochable que possible, car, pour l'aprennant, il
est difficile de détecter et corriger les éventuelles approximations
rencontrées. (Quand on discute entre experts, on peut se permettre plus
de laxisme et compter sur l'expertise de l'interlocuteur pour tranformer
l'exemple vague en un truc correct si le besoin s'en fait sentir.)

La question qui me vient immédiatement est: est-ce que ca meurt parce
qu'il y a mieux ailleurs ou parce que le comportement intégriste a fait
fuir les bonnes volontés? Cela dit, visiblement il y a quand même un peu
de monde qui lit. Peut être qu'ils vont sortir et poster un peu. Ca
changera des 3 piliers de (foo)bar^Wgroupe dont tu fais référence.



Je ne représente sans doute pas la majorité, mais à titre personnel, si
j'aime bien lurker, poser des questions et participer plus activement
aux groupes où mes compétences me le permettent, sur Usenet plutôt
qu'ailleurs, c'est précisément à cause de la rigueur (ce que tu sembles
appeler intégrisme) des contributeurs réguliers (ceux que tu appelles
piliers).

(Et aussi parce que le format et les outils disponibles correspondent
mieux à mes goûts de jeune dinosaure que les forums web.)

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Avatar
Samuel DEVULDER
Manuel Pégourié-Gonnard a écrit :

Ton analogie me semble erronée. Il me semble que faire lire aux gens du



C'est possible. Mais ca dépend du point de vue adopté.

code médiocre (pour ne pas dire faux, histoire de rester nuauncé) en
s'attendant à ce qu'ils pondent du code meilleur, c'est plutôt comme si



C'est pas vraiment ma position. Il n'est pas question d'enseigner quoi
que ce soit. Ma position serait plutôt de trouver comment constater que
deux flottants en mémoire sont différents alors qu'ils s'affichent
pareil avec printf(). Il s'agit ici de la position d'un expérimentateur
et pas d'un prof face à des élèves. En tout cas c'est ce que j'ai
compris que cherchais initialement Emmanuel.

un cours de maths contenait des pseudo-démonstrations approximatives,
et qu'on demande ensuite aux étudiants de faire des vraies
démonstrations rigoureuses sur leurs copies.



Et pourtant nombre de choses incomplète laissées "en exercice" à l'élève
existent. Les supports de cours sont loin d'être tous exacts dans leur
démonstrations et l'on ne trouve parfois qu'une vague idée de preuve.
Cela dit, cette vague idée donnant l'intuition du "pourquoi c'est vrai"
est probablement plus profitable que de lire la démonstration technique
hyper détaillée que l'on trouvera plus facilement dans le bouquin du
prof qui a fait ce support de cours. (enfin s'il n'a pas laissé l'aspect
technique en exercices à ses lecteurs ;-) ).

L'expérience prouve que quand une personne en phase d'apprentissage
reproduit ce qu'elle a vu, c'est généralement avec une baisse (plutôt
qu'une hausse) de qualité. Il faut donc mieux que le matériel pris comme
exemple soit aussi irréprochable que possible, car, pour l'aprennant, il
est difficile de détecter et corriger les éventuelles approximations
rencontrées. (Quand on discute entre experts, on peut se permettre plus
de laxisme et compter sur l'expertise de l'interlocuteur pour tranformer
l'exemple vague en un truc correct si le besoin s'en fait sentir.)



A la lecture je constate que tu places ton point de vue sur l'axe
enseignant->élève. La question sous-jacente est: est-ce que ce groupe
sert à enseigner le C par des profs de fac ou a discuter entre
praticiens du C? A priori j'ai cru qu'on avait affaire à des gens qui
codent effectivement en C et veulent partager leur expériences et
problèmes. J'ai peut être tord... j'avais pas vu que c'était réservé aux
profs. Je comprends mieux l'aversion constatée envers tout ce qui porte
le mot "industriel" de certain :) J'ai empiété quelques prés-carrés. Désolé.

La question qui me vient immédiatement est: est-ce que ca meurt parce
qu'il y a mieux ailleurs ou parce que le comportement intégriste a fait
fuir les bonnes volontés? Cela dit, visiblement il y a quand même un peu
de monde qui lit. Peut être qu'ils vont sortir et poster un peu. Ca
changera des 3 piliers de (foo)bar^Wgroupe dont tu fais référence.



Je ne représente sans doute pas la majorité, mais à titre personnel, si
j'aime bien lurker, poser des questions et participer plus activement
aux groupes où mes compétences me le permettent, sur Usenet plutôt
qu'ailleurs, c'est précisément à cause de la rigueur (ce que tu sembles
appeler intégrisme) des contributeurs réguliers (ceux que tu appelles
piliers).



Oui j'y vais fort avec des mots tels que "intégristes"... En fait, c'est
parce qu'il y a un une similitude de comportement et un rejet du point
de vue de l'autre qui sont indéniables entre les deux. La rigueur c'est
bien mais pas en toute circonstances (on est pas chez les amishs!). Il
faut savoir rester pragmatique. Emmanuel ne cherchait pas je crois un
cours sur la portabilité de l'usage de l'union ou du sizeof(long) mais
voir en quoi ses deux doubles diffèrent. Ceux qui ont produit du code
(même légèrement faux) ont répondus a ses attentes.. ceux qui ont parlés
machines 64bits, sizeof(long)==8 ont juste tout faux par rapport au pb
initial.

Pour les piliers c'est parce que je cherchais à introduire une pointe
d'humour avec le "bar" (de foo-bar), discussion de comptoir, etc. (il y
en a quasi toujours dans mes messages quand l'ambiance est tendue[*].
Désolé si c'est mal interprété.)
____
[*] Normalement c'est la perche qu'on tend.. mais un autre poisson a
déjà eu l'honneur de ce mois d'avril. ;-)

(Et aussi parce que le format et les outils disponibles correspondent
mieux à mes goûts de jeune dinosaure que les forums web.)



Déjà il ne faut pas s'enregistrer.. C'est beaucoup plus simple.

sam.
Avatar
Vincent Belaïche
Merci de ta réponse,

j'ai cherché pas mal de temps sur http://www.mingw.org/ la dernière
bibliothèque C pour MingGW sur MSWindow, mais je ne suis pas sûr de
comment se nomme le fichier, et où elle se trouve.

En tout cas pour un truc (le printf("%a",...) ) spécifié depuis 10ans,
c'est surprenant que ce ne soit pas déjà de base dans MinGW (je crois
que j'ai installé sur cette machine MinGW depuis moins d'un an).

Vincent B.

Vincent Lefevre a écrit :
Dans l'article ,
Vincent Belaïche écrit:

Sinon mis à part ça j'ai fait un essai de %a avec gcc version 3.4.5, et
ça ne le fait pas.



int main(void)
{
printf("H%a h%a h%a !n",3.14,0.0,12345.0);
printf("%f %f %f n",0x3.23D70A3Dp0, 0x.p0, 0x3039.p0);
return 0;
}



ça fait:



Ha ha ha !
3.140000 0.000000 12345.000000



Ce qui prouve que les constantes sont implantées, mais pas le printf.



Bah gcc n'implémente pas printf. C'est la "bibliothèque C" qui le fait.