OVH Cloud OVH Cloud

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

9 réponses

Avatar
Vincent Lefevre
Dans l'article <hpuhsl$kgr$,
Antoine Leca écrit:

Samuel DEVULDER écrivit :
> Manuel Pégourié-Gonnard a écrit :
>
>> Bah, je ne connais pas d'autre façon d'appeler un développement avec un
>> nombre fini de chiffres, puis un séparateur « décimal » (virgule ou
>> point) et un suite potentiellement infinie de chiffres après. Je
>
> C'est le séparateur de la partie fractionnaire, c'est tout, non?

J'y pensai aussi, mais je ne pense pas que ce soit habile ici : en effet
on cherchait (dans le sous-fil) à définir les nombres réels, donc une
référence aux fractions me paraît déplacée.



La partie fractionnaire est ce qui suit la virgule. Je ne vois pas
de référence aux fractions outre le nom, et qu'en anglais on utilise
le terme "fraction" (mais qui n'a pas le même sens qu'en français).

--
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
Antoine Leca a écrit :
Samuel DEVULDER écrivit :
Manuel Pégourié-Gonnard a écrit :

Bah, je ne connais pas d'autre façon d'appeler un développement avec un
nombre fini de chiffres, puis un séparateur « décimal » (virgule ou
point) et un suite potentiellement infinie de chiffres après. Je


C'est le séparateur de la partie fractionnaire, c'est tout, non?



J'y pensai aussi, mais je ne pense pas que ce soit habile ici : en effet
on cherchait (dans le sous-fil) à définir les nombres réels, donc une
référence aux fractions me paraît déplacée.



Ben pourtant c'est ce qui les différencie des entiers ce petit truc plus
petit que les entiers non nuls.

Similairement, et puisque j'aime bien digresser, on peut se dire que
c'est pareil pour les nombres infinitésimaux: c'est le petit truc en
plus inférieur à tous les rééls non nuls, qu'il y a autour des reels.

Bref: fractionnaire doit s'entrendre ici comme la partie après la
virgule. Donc uniquement les fractions p/q avec 0<p<q.

sam.
Avatar
Manuel Pégourié-Gonnard
Vincent Lefevre scripsit :

Dans l'article <hpuhsl$kgr$,
Antoine Leca écrit:

Samuel DEVULDER écrivit :
> Manuel Pégourié-Gonnard a écrit :
>
>> Bah, je ne connais pas d'autre façon d'appeler un développement avec un
>> nombre fini de chiffres, puis un séparateur « décimal » (virgule ou
>> point) et un suite potentiellement infinie de chiffres après. Je
>
> C'est le séparateur de la partie fractionnaire, c'est tout, non?



J'y pensai aussi, mais je ne pense pas que ce soit habile ici : en effet
on cherchait (dans le sous-fil) à définir les nombres réels, donc une
référence aux fractions me paraît déplacée.



La partie fractionnaire est ce qui suit la virgule. Je ne vois pas
de référence aux fractions outre le nom, et qu'en anglais on utilise
le terme "fraction" (mais qui n'a pas le même sens qu'en français).



Séparateur de la partie fractionnaire me semble parfaitement clair (même si un
peu lourd). Bon, de toutes façons je ne sais pas si on a souvent besoin d'être
aussi précis.


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


[ Parlant de « partie fractionnaire » ]
J'y pensai aussi, mais je ne pense pas que ce soit habile ici : en effet
on cherchait (dans le sous-fil) à définir les nombres réels, donc une
référence aux fractions me paraît déplacée.



Ben pourtant c'est ce qui les différencie des entiers ce petit truc plus
petit que les entiers non nuls.



Non. En C, dès qu'il y a la virgule, c'est un nombre flottant. Même s'il
n'y a pas de partie fractionnaire (pas de chiffre, s'entend).


Antoine
Avatar
Samuel DEVULDER
Antoine Leca a écrit :
Samuel DEVULDER écrivit :
Antoine Leca a écrit :


[ Parlant de « partie fractionnaire » ]
J'y pensai aussi, mais je ne pense pas que ce soit habile ici : en effet
on cherchait (dans le sous-fil) à définir les nombres réels, donc une






^^^^^^^^^^^^^^^^^^^^^^^^^^^
référence aux fractions me paraît déplacée.


Ben pourtant c'est ce qui les différencie des entiers ce petit truc plus
petit que les entiers non nuls.



Non. En C, dès qu'il y a la virgule, c'est un nombre flottant. Même s'il
n'y a pas de partie fractionnaire (pas de chiffre, s'entend).



Ah oui en C.. Ah oui, tout à fait.. Cependant, il me semble qu'ici, dans
le filn il s'agit d'un contexte plus mathématique. cf "on cherchait à
définir les nombres réels".

sam.
Avatar
espie
In article <4bc2d3b4$0$30366$,
Samuel DEVULDER wrote:
Antoine Leca a écrit :
Samuel DEVULDER écrivit :
Manuel Pégourié-Gonnard a écrit :

Bah, je ne connais pas d'autre façon d'appeler un développement avec un
nombre fini de chiffres, puis un séparateur « décimal » (virgule ou
point) et un suite potentiellement infinie de chiffres après. Je


C'est le séparateur de la partie fractionnaire, c'est tout, non?



J'y pensai aussi, mais je ne pense pas que ce soit habile ici : en effet
on cherchait (dans le sous-fil) à définir les nombres réels, donc une
référence aux fractions me paraît déplacée.



Ben pourtant c'est ce qui les différencie des entiers ce petit truc plus
petit que les entiers non nuls.



Non, meme pas, parce que t'as ca pour les rationnels, qui sont quand meme
un objet vachement plus simple a comprendre que les reels.

Similairement, et puisque j'aime bien digresser, on peut se dire que
c'est pareil pour les nombres infinitésimaux: c'est le petit truc en
plus inférieur à tous les rééls non nuls, qu'il y a autour des reels.



Ca, ca suppose de completer ton modele de facon non standard, et donc
d'abandonner tout espoir de faire de la logique d'ordre superieur a 1.

Si tu veux des definitions des reels, c'est pas dur. La premiere toute bete
(et pas du tout manipulable): tout nombre a virgule, avec un nombre infini
de chiffres apres la virgule (denombrable et ordonne, hein ton infini), avec
juste la contrainte que ton ecriture n'a pas le droit de finir en 9999....
ou que tu dois rendre equivalent n9999.... et n+10000....

La deuxieme moins bete, c'est de prendre toutes les suites de nombres
rationnels. Les nombres reels, c'est les suites qui converger vers quelque
chose de fini, ce qui se definit assez classiquement a coup d'epsilon,
quotiente par le fait de converger vers la meme valeur. On montre assez
facilement que les operations usuelles passent au quotient, et un peu moins
facilement que c'est "complet" en un sens raisonnable.

Si on veut revenir au C, les nombres representables sont un sous-ensemble
tres specifique de l'ensemble des nombres rationnels. C'est d'ailleurs assez
rigolo, parce que ca a une structure "en peigne" assez similaire a une
fractale (evidemment, jusqu'a la resolution concernee... comme toute bonne
fractale dans le vrai monde, ca ne marche que jusqu'a une certaine echelle).
La notion d'equivalence va la-aussi etre utile, puisque tu as plusieurs
representations de la meme valeur dans certains cas, grace a la joie du -0.0
et des nombres denormalises...

Rien de bien passionnant au final.

Histoire de faire avancer un peu la discussion, je rappelle a l'auditoire
l'existence d'un certain Donald Knuth, informaticien extremement brillant de
son etat, qui a commis il y a pas mal d'annees un "semi-numerical algorithms"
(ISBN 0-201-03822-6), dans son Opus fort justement nomme "the art of computer
programming". Cet ouvrage constitue une excellente base concernant les
systemes de numeration, leur utilisation en informatique... et en particulier
contient pas mal de resultats fondamentaux sur le calcul sur les flottants
(qui n'a que peu a voir avec les calculs sur les nombres reels, au final).

Si on avait un enseignement d'informatique digne de ce nom, toute personne
qu'on autorise a toucher un float ou un double en C devrait connaitre la
plupart des elements de ce bouquin. Manque de bol, pour tout un ensemble
de raisons pratiques (entre autres le fait qu'on laisse des gens ecrire du
code numerique sans les bases mathematiques indispensables. Mais aussi le
fait qu'on prefere faire du proselytisme que d'expliquer aux gens que
l'informatique, c'est complique), il doit trainer par ici un certain nombre
de debutants qui n'en ont jamais entendu parler. Je ne saurais trop leur
conseiller d'enrichir leur culture...
Avatar
Manuel Pégourié-Gonnard
Marc Espie scripsit :

Si tu veux des definitions des reels, c'est pas dur. La premiere toute bete
(et pas du tout manipulable): tout nombre a virgule, avec un nombre infini
de chiffres apres la virgule (denombrable et ordonne, hein ton infini), avec
juste la contrainte que ton ecriture n'a pas le droit de finir en 9999....
ou que tu dois rendre equivalent n9999.... et n+10000....



Voilà.

La deuxieme moins bete, c'est de prendre toutes les suites de nombres
rationnels. Les nombres reels, c'est les suites qui converger vers quelque
chose de fini, ce qui se definit assez classiquement a coup d'epsilon,
quotiente par le fait de converger vers la meme valeur.



Bah, pour l'instant, on peut pas encore parler de valeur de convergence
vu qu'on a pas encore les réels à notre disposition. Donc on dira plutôt
« être de Cauchy » que « converger vers un truc fini », et pour
« converger vers la même valeur » on dira plutôt que la différence tend
vers 0. Enfin, ce sont des détails techniques pour éviter de se mordre
la queue, l'idée de base étant effectivement ce que tu as dit.

On montre assez
facilement que les operations usuelles passent au quotient, et un peu moins
facilement que c'est "complet" en un sens raisonnable.



Bah, en même temps, pour la complétude, on a fait exprès (c'est une
construction qui marche dans tous les espaces métriques),
personnellement je trouve pas que ça soit moins facile à vérifier que,
par exemple, l'existence d'un inverse. Il faut aussi définir une
relation d'ordre, en plus des opérations usuelles.

Si on avait un enseignement d'informatique digne de ce nom, toute personne
qu'on autorise a toucher un float ou un double en C devrait connaitre la
plupart des elements de ce bouquin. Manque de bol, pour tout un ensemble
de raisons pratiques (entre autres le fait qu'on laisse des gens ecrire du
code numerique sans les bases mathematiques indispensables. Mais aussi le
fait qu'on prefere faire du proselytisme que d'expliquer aux gens que
l'informatique, c'est complique), il doit trainer par ici un certain nombre
de debutants qui n'en ont jamais entendu parler. Je ne saurais trop leur
conseiller d'enrichir leur culture...



Puis au milieu, il y a les gens qui savent que TAOCP existe et contient
des tas de trucs intéressants (et compliqués), et qui n'ont
malheureusement pas (encore eu) le temps de s'y plonger, parce que mine
de rien le biniou est dense et un peu imposant.

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Avatar
Vincent Belaïche
Antoine Leca a écrit :
Quand j'étais petit, les Américains n'avaient pas encore imposé leurs
conventions partout, et cela s'appelait une virgule tout court, terme
qui contrairement à « séparateur décimal » a l'avantage de fonctionner
pour d'autres bases (et qui est indépendant de la base, si je ne m'abuse).


Je crois que la discussion était partie sur "développement décimal" pour
une base autre que 10, et non sur "séparateur décimal" pour quoi en
effet "virgule" fait très bien l'affaire ("le fait" pour parler
américain ;-) ).

D'un autre côté on dit bien "décimer" pour des facteur de décimation
autre que 10. Ce n'est après tout que convention comme disait Manuel il
suffit de bien définir les termes et de préciser que "développement
décimal" s'applique à d'autre base que 10.

Il faudrait presque aller dans l'autre sens et faire un néologisme pour
remplacer décimal lorsque il a le sens strict de "en base dix". On
pourrait dire "décimal au sens strict", ou bien encore "decienaire"
(voir http://www.guichetdusavoir.org/ipb/index.php?showtopic939) car
bis donne binaire, ter donne ternaire, quater donne quaternaire, et
logiquement decies --- 10x --- devrait donner décienaire et non décimal,
et sexdecies --- 16x --- sexdecienaire et non hexadecimal.

De même, les chiffres après la virgule s'appelaient les sous-unités (du
premier, deuxième etc. ordre).




Et avant la virgule, les "sur-unité"s ?

Vincent.
Avatar
Vincent Lefevre
Dans l'article <hpv759$d1r$,
Marc Espie écrit:

La notion d'equivalence va la-aussi etre utile, puisque tu as plusieurs
representations de la meme valeur dans certains cas, grace a la joie du -0.0
et des nombres denormalises...



Par dénormalisés, je suppose que tu parles de cohortes (pour le
décimal), non?

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