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
Jean-Marc Bourguet
Vincent Belaïche writes:

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.



Le principe même de MingGW c'est d'utiliser gcc avec la bibliothè que
de Microsoft (qui est installée d'office avec l'OS et qui doit êt re C95).

A+

--
Jean-Marc
Avatar
Vincent Lefevre
Dans l'article ,
Vincent Belaïche écrit:

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).



C'est de la faute de Microsoft:

http://oldwiki.mingw.org/index.php/C99
http://groupes.codes-sources.com/article-mingw-c99-fut-printf-amies-drosophiles-serrez-miches-2300.aspx

--
Vincent Lefèvre - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)
Avatar
Vincent Lefevre
Dans l'article <4bba6f5c$0$10138$,
Samuel DEVULDER écrit:

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.



Que tu le veuilles ou non, un grand nombre de personnes considèrent ce
qui est posté dans les groupes de discussion (tout comme sur le web)
comme des enseignements. Et ils n'ont pas forcément la possibilité
de distinguer le vrai du faux, surtout si les idées fausses sont
répandues, que ce soit sur Usenet, sur le web et même dans des docs
réputées sérieuses, voire plus ou moins officielles.

Donc quand on trouve une erreur, on la signale.

> 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.



Mais quand quelque chose est incomplet, on est suffisamment clair et
on indique ce qui est incomplet.

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.



Idem, si la preuve est incomplète, on le dit.

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?



Cf ce que je dis plus haut.

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.



Il y a aussi des lecteurs (qui ne postent pas, qui trouveront la
discussion plus tard via un moteur de recherche, etc.), débutants
ou non, qui ne connaissent pas suffisamment certains points
techniques.

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.



Quand on poste ici, on ne s'adresse pas uniquement à l'OP.
Celui-ci n'avait d'ailleurs même pas donné l'architecture
et l'OS de sa machine.

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.



Non, les machines 64 bits existent même dans la pratique, cela
pourrait très bien être la machine de l'OP ou d'un autre lecteur
qui a le même problème. Sur de telles machines, le code contient
un comportement indéfini exploitable par le compilateur et doit
donc être considéré comme complètement faux.

--
Vincent Lefèvre - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)
Avatar
Vincent Lefevre
Dans l'article <4bb9c85f$0$14936$,
Samuel DEVULDER écrit:

Pourquoi? Parce que ca ne va pas dans ton sens? Non merci. Du reste
parler d'exposant décimal pour dire qu'on l'affiche en base dix est ce
qu'on appelle parler du français ou un anglais correct.



Quand on parle français, on est censé faire la distinction entre
nombre et la représentation ou l'écriture d'un nombre. Ce sont
deux concepts différents (même si parfois on fait des raccourcis,
mais en toute rigueur, on ne devrait pas). Quand je parlais
d'exposant décimal, je faisais référence au nombre, et non pas
à son écriture. Sinon on dit explicitement: "exposant écrit en
base 10".

Du reste tes conseils seraient plus utiles si tu passait l'URL de la
norme C-ISO au moins.



Norme ISO C99 avec TC3:

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

--
Vincent Lefèvre - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)
Avatar
espie
In article <4bba6f5c$0$10138$,
Samuel DEVULDER wrote:
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é.



Encore une simplification abusive ;-)

Pourquoi est-ce que ca devrait etre l'un des deux ?
Bien sur que c'est prevu pour les praticiens du C !
Mais a cote de ca, l'etudiant moderne googleifie a tout va, et j'en
ai vu qui prennent (presque) pour argent comptant les conneries qu'ils
trouvent sur usenet ou le web.

Suffit que ce groupe soit indexe par googlegroups ou assimile, suffit
d'un etudiant qui cherche en francais (il y en a plein), et hop, ta photo
en premiere page de son navigateur.

Donc oui, il convient de faire un peu gaffe a ce qu'on raconte, et en
particulier d'accepter de se faire corriger quand on raconte des trucs
qui ne sont pas clairs/pas precis/incomplets...
Avatar
Vincent Lefevre
Dans l'article <4bba4784$0$22048$,
Samuel DEVULDER écrit:

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".



Parce que tu n'est pas assez grand pour aller chercher la référence
tout seul (e.g. avec une fonction recherche sur un document
électronique, ou via l'index)?

Bien souvent une explication indiquant la raison de pourquoi la
norme impose ceci ou cela sera de loin profitable.



Ce n'était pas le sujet, mais tu peux aller voir le rationale pour
cela. Maintenant il n'y a pas tout, et les explications de certains
choix ne sont pas toujours connues.

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



Là encore, les lecteurs sont censés être capables de regarder dans
la FAQ (pas toujours à jour, mais on peut le signaler) ou faire des
recherches sur Google. Par exemple, taper

norme c99

donne comme premier lien:

http://www.developpez.net/forums/d492343/c-cpp/c/consultez-norme-c99/

qui donne l'URL

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

--
Vincent Lefèvre - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)
Avatar
Vincent Lefevre
Dans l'article <20100406074519$,
Vincent Lefevre écrit:

Là encore, les lecteurs sont censés être capables de regarder dans
la FAQ (pas toujours à jour, mais on peut le signaler) ou faire des
recherches sur Google. Par exemple, taper

norme c99

donne comme premier lien:

http://www.developpez.net/forums/d492343/c-cpp/c/consultez-norme-c99/

qui donne l'URL

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf



Au fait, je signale aussi que Wikipedia (version anglaise de
préférence, en général) est souvent une excellente source pour
les *références*.

--
Vincent Lefèvre - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)
Avatar
Samuel DEVULDER
Vincent Lefevre a écrit :
Dans l'article <4bb9c85f$0$14936$,
Samuel DEVULDER écrit:

Pourquoi? Parce que ca ne va pas dans ton sens? Non merci. Du reste
parler d'exposant décimal pour dire qu'on l'affiche en base dix est ce
qu'on appelle parler du français ou un anglais correct.



Quand on parle français, on est censé faire la distinction entre
nombre et la représentation ou l'écriture d'un nombre. Ce sont
deux concepts différents (même si parfois on fait des raccourcis,
mais en toute rigueur, on ne devrait pas). Quand je parlais
d'exposant décimal, je faisais référence au nombre, et non pas
à son écriture. Sinon on dit explicitement: "exposant écrit en
base 10".



Non. Quand on parle d'un nombre on ne parle pas de sa représentation. On
dit exposant "tout court". Si on précise décimal, cela signifie qu'on
parle de sa représentation en base dix (j'ai écrit dix, et pas 10 avec
dessein: c'est le nombre dix dont il s'agit, pas les lettres 1 et 0).

Quand tu parles d'exposant binaire (et pas décimal), tu signifies
quelque chose qui s'écrit en base 2, uniquement avec des 0 et des 1. Bon
ton expression était incorrecte, non conforme, bref un bug. C'est pas
grave. Ta réponse à mon interrogation a levé le doute. L'affichage de %a
donne dans tous les cas un exposant décimal: p100 signifie deux à la
puissance cent et pas puissance huit (ou autre). Rien de binaire dans
cette représentation.

Comme on dit: Il y a 10 sortes de gens: ceux qui comprennent le binaire
et les autres. ;-)

sam.
Avatar
Erwan David
Samuel DEVULDER écrivait :


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é.



Tu sais il y a ici pas mal de gens qui programment où ont programmé en C
dans l'industrie. Et la plupart sont tout à fait d'accord avec Marc.

Quand comme moi on se retrouve à coder pour de l'embarqué avec des
plateformes mélangées 16 et 32 bits, des compilos bizares et étranges
qu'on ne connaitra qu'une fois le code écrit parcequ'un nouveau client
apportera une nouvelle architecture avec son compilo, la seule solution
c'est de coller à la norme. J'ai pas trop d'avis sur le printf de
flottants parceque mon expérience c'est du freestanding sans flottants
donc je n'ai rien dit. Mais la norme c'est vraiment la bouée de
sauvetage.


--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
Vincent Lefevre
Dans l'article <4bbaf06b$0$12193$,
Samuel DEVULDER écrit:

Vincent Lefevre a écrit :
> Quand on parle français, on est censé faire la distinction entre
> nombre et la représentation ou l'écriture d'un nombre. Ce sont
> deux concepts différents (même si parfois on fait des raccourcis,
> mais en toute rigueur, on ne devrait pas). Quand je parlais
> d'exposant décimal, je faisais référence au nombre, et non pas
> à son écriture. Sinon on dit explicitement: "exposant écrit en
> base 10".

Non. Quand on parle d'un nombre on ne parle pas de sa représentation.



C'est exactement ce que je dis.

On dit exposant "tout court". Si on précise décimal, cela signifie
qu'on parle de sa représentation en base dix (j'ai écrit dix, et pas
10 avec dessein: c'est le nombre dix dont il s'agit, pas les lettres
1 et 0).



Non. Par exemple, en math, un "nombre décimal" est un nombre dont
une écriture en base 10 peut s'écrire sur un nombre fini de chiffres.
C'est une propriété sur le nombre lui-même. On peut toujours l'écrire
en binaire ou sous forme de fraction...

Ici, dans "exposant binaire", "binaire" donne une information sur la
sémantique de l'exposant.

Quand tu parles d'exposant binaire (et pas décimal), tu signifies
quelque chose qui s'écrit en base 2, uniquement avec des 0 et des 1. Bon
ton expression était incorrecte, non conforme, bref un bug.



Arf! Dans la norme: "binary exponent part".

--
Vincent Lefèvre - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)