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

10 réponses

Avatar
Jean-Marc Bourguet
Vincent Lefevre writes:

si une raison de rejeter les typedef est les conflits entre en-têtes,



Comme toi, je ne vois pas de différence entre une typedef et un nom de tag
sur ce point.

Je vais beaucoup moins loin que Marc en ce qui concerne les typedefs. Ce
que je n'aime pas, c'est avoir une multitude de noms différents pour la
même chose et qui doivent être tous définis à la même chose pour que ça
fonctionne.

(C'est le même genre d'objections que j'ai avec du code qui veut éviter les
variables globales et les singletons à tout prix. On se retrouve en
pratique avec un bazillon de pointeur et du code qui suppose que tous
pointent vers la même chose et si c'est pas le cas, ça casse et c'est
pénible de savoir où; en plus du manque d'attention, quand on en a deux en
vue, c'est parfois difficile de savoir lequel utiliser tant qu'on ne
profite pas de la variabilité -- mon expérience me dit qu'amener un
troisième est parfois le bon choix).

On se ment moins en ne prétendant pas traiter la variation. Et quand elle
devient nécessaire, c'est plus facile de savoir comment la traiter et
sachant dans quel sens elle va. Les seuls cas où ça fonctionne parfois,
c'est quand on a déjà la variation en vue mais qu'on ne veut pas la traiter
complètement pour le moment (et assez souvent, même si on l'avait en vue on
ne la traitera jamais).

A+

--
Jean-Marc
FAQ de fclc: http://www.levenez.com/lang/c/faq
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Samuel DEVULDER
Jean-Marc Bourguet a écrit :

(C'est le même genre d'objections que j'ai avec du code qui veut éviter les
variables globales et les singletons à tout prix. On se retrouve en
pratique avec un bazillon de pointeur et du code qui suppose que tous
pointent vers la même chose et si c'est pas le cas, ça casse et c'est



On dirait presque un pb d'architecture logicielle ou de modélisation,
voir de documentation mais pas fondamentalement un truc propre à C.

On trouve ces soucis là partout dès qu'un code est un peu gros, a vécu
un peu, et est passé entre plusieurs mains (chacune préférant définir un
type à elle dont elle a la maitrise plutôt que d'utiliser / modifier ce
qui existe mais dont on est pas vraiment sur si c'est le bon truc au
juste car c'est mal documenté).

Parfois sortir un dessin avec "qui pointe sur quoi", "qui dépend de
quoi", bref faire du reverse engineering, permet de voir "où" supprimer
ces pointeurs et ces types
redondants-mais-pas-toujours-enfin-on-sait-pas-vu-que-c-est-pas-nous-qu-on-a-ecrit-le-code-en-question
(oulà).

L'autre option pour les sources devenus dur à modifier au fil du temps,
c'est de tout refaire from scratch.

sam.
Avatar
Vincent Belaïche
Bonjour,

Comme Manuel l'a précisé, en effet on peut donner beaucoup de
signification aux mots binaire ou décimal. Quand on parle de nombre
d'un certain type (binaire, décimal ou autre) on fait référence à
l'ensemble de ces nombres et éventuellement aux propriétés de cet
ensemble (lois de composition interne, etc...).

Ce que je voulais dire c'est tout simplement que la façon dont on
représente en mémoire un nombre détermine certaines de ces
caractéristiques, notamment le plus petit nombre de ce type, le plus
grand, la granularité (un pas constant comme pour les entiers ou les
nombre à virgule fixe, ou un pas relatif comme pour les nombre à virgule
flottante).

Discuter de savoir si un nombre peut exister indépendamment de la façon
de l'écrire ça revient un peu à dire si un objet mathématique existe si
on a un algorithme pour le construire, ou si on ne pas peut démontrer
que le contraire est faux, et sans être spécialiste d'axiomatique j'ai
entendu dire que c'était indémontrable.

sqrt(2) n'est ni binaire ni décimal, mais on pourrait avoir une format
interne en machine qui le représente exactement (par exemple une suite
d'entiers coefficients d'un polynôme dont il est racine, et un numéro
d'ordre donnant la racine considérée). Même s'il y a plusieurs façon de
représenter sqrt(2) (dont la façon textuelle ``sqrt(2)'') il me semble
un peu abusif, parlant des nombre non transcendants, de dire qu'ils
existent complètement indépendamment de la façon de les écrire, puisque
en général la façon de les écrire est basée sur une méthode pour les
construire.

Vincent.


Samuel DEVULDER a écrit :
Vincent Belaïche a écrit :
OK, la représentation textuelle est complètement orthogonale de la
représentation en mémoire, et dépend de la machine.

J'avais ajouté la dernière colonne parce que la discussion était
partie sur ce que veut dire "binaire" ou "décimal" lorsque on parle de
nombre binaire ou de nombre "décimal". Je maintiens que, en français,
lorsque on applique cette épithète au mot nombre, on fait référence à
ses propriétés mathématiques, qui en dernier ressort dépendent de la
façon dont il est mémorisé dans la machine.



Je ne suis pas d'accord. Décimal ou binaire n'est absolument pas une
propriété intrinsèque d'un nombre. Un nombre est un truc qui existe
indépendamment de la façon de l'écrire. Est-ce que sqrt(2) est binaire
ou décimal? Ni l'un ni l'autre, par contre on peut le *représenter* avec
des chiffres binaires ou décimaux.

Avatar
Samuel DEVULDER
Vincent Belaïche a écrit :
Bonjour,

sqrt(2) n'est ni binaire ni décimal, mais on pourrait avoir une format



Et c'est même pire.. Il y a quelques milliers d'années, à l'époque de
pythagore, certains pensaient que sqrt(2) n'était pas un nombre car il n
n'entrait pas dans les calculs et la vision du monde de l'époque. Au
mieux, ils devaient considérer sqrt(2) comme un nombre "imaginaire" avec
lequel on peut calculer des trucs, mais qui ne marche pas exactement
comme les nombres de l'époque (les fractions). ;-)

Pour nous, à notre époque, on a pas tellement évolué: on a juste
remplacé 2 par -1!

interne en machine qui le représente exactement (par exemple une suite
d'entiers coefficients d'un polynôme dont il est racine, et un numéro
d'ordre donnant la racine considérée).



Oui ca se fait très classiquement en symbolique. Mais pour les racines
carrées et quelques autres trucs rigolo il y a les fractions continues
présentant des motifs dans leur développements.
sqrt(2) = 1+1/(2+1/(2+1/(2+..))) = [1, 2, 2, 2...]

Même s'il y a plusieurs façon de
représenter sqrt(2) (dont la façon textuelle ``sqrt(2)'') il me semble
un peu abusif, parlant des nombre non transcendants, de dire qu'ils
existent complètement indépendamment de la façon de les écrire, puisque
en général la façon de les écrire est basée sur une méthode pour les
construire.



Je ne suis pas certain.. tu sous entends qu'il n'y a qu'une seule façon
d'écrire un nombre. C'est évidemment faux (sqrt(2) n'est pas une
exception). D'autre part il existe d'autres nombres algébriques qu'on ne
peut pas écrire/décrire avec des radicaux comme pour sqrt(2): la
solution de x^5-x-1=0 par exemple. Ils existent, mais on ne peut pas les
construire avec les outils tels que addition / soustraction / division
/ radical.

D'ailleurs, je pense qu'il y a un léger mélange dans ce que tu écris entre:
- écrire un nombre (1.414...)
- construire ce nombre (Je sais pas? Somme(ai*b^n), avec 0<=ai<b,
fractions continues, etc.)
- décrire ce nombre: RootOf(x^2-2,x), 2*cos(pi/4), ...
- nommer ce nombre: sqrt(2)
- représenter ce nombre avec une suite de symboles finis dans un système
formel (par exemple les coefs du polynôme du rootof: [1, 0, 2])
- utiliser ce nombre pour évaluer des expressions: sqrt(3*sqrt(2))-2 est
il positif?

Il existe en math la notion de nombre calculables. Ce sont des nombres
qui approximent les réels avec une précision arbitrairement faible à
partir d'un algo qui termine en temps fini. En fait, ils approximent
suffisamment l'ensemble des réels pour qu'on les confondent pour
certaines propriétés, mais pas toutes. Quoi qu'on fasse, il y a des
nombres non-calculables, et qu'on se saura non seulement pas écrire (ou
décrire), mais même pas approximer à partir d'un algo fini.

Quelque part on est finalement parti à la recherche de "qu'est ce qu'un
nombre" et ça nous éloigne carrément du C.. Cela nous renvoie vers des
maths balèzes (axiome du choix, maths constructives, etc.), voir même
vers une question philosophique qui n'a pas trouvé de réponse
satisfaisante depuis les quelques milliers d'années que l'humanité y
réfléchie.

sam.
Avatar
Emmanuel
Emmanuel a écrit :
bonjour tout le monde,
[snip]
une question de vrai débutant :
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



Pinaise, je dois avouer que je ne m'attendais pas à une telle rafale de
réponses (et d'insultes) pour une question aussi anodine (?), en même
pas 2 semaines. Reste plus qu'à tirer la substantifique moelle de tout
ça... usenet is dying, qui disait.

--
Emmanuel
Avatar
Antoine Leca
Samuel DEVULDER écrivit :
sqrt(2) [...]



Et c'est même pire.. Il y a quelques milliers d'années, à l'époque de
pythagore, certains pensaient que sqrt(2) n'était pas un nombre car il n
n'entrait pas dans les calculs et la vision du monde de l'époque.

Pour nous, à notre époque, on a pas tellement évolué: on a juste
remplacé 2 par -1!



En même temps cela fait plus de 100 ans que ce « problème » est résolu ;
mais évidemment la « solution » (les complexes) n'est pas pratique...


tu sous entends qu'il n'y a qu'une seule façon d'écrire un nombre.



Pile dans le mille. Il y a d'une part les nombres, et d'autre part leurs
représentations. Le fait (comme tu le soulignes justement) qu'il n'y ait
pas de bijection entre les deux, suggère fortement qu'il s'agisse de
deux notions distinctes, avec des propriétés différentes...

La thèse initiale de Vincent, telle que je l'avais comprise, était que
certaines propriétés, comme la base de numération, n'avaient pas de sens
pour les nombres (au sens mathématique pur). Quelqu'un en douterait-il ?


Quelque part on est finalement parti à la recherche de "qu'est ce qu'un
nombre" et ça nous éloigne carrément du C..



Oui.


Antoine
Avatar
espie
In article <hpmoe0$quk$,
Antoine Leca wrote:
Samuel DEVULDER écrivit :
sqrt(2) [...]



Et c'est même pire.. Il y a quelques milliers d'années, à l'époque de
pythagore, certains pensaient que sqrt(2) n'était pas un nombre car il n
n'entrait pas dans les calculs et la vision du monde de l'époque.

Pour nous, à notre époque, on a pas tellement évolué: on a juste
remplacé 2 par -1!



En même temps cela fait plus de 100 ans que ce « problème » est résolu ;
mais évidemment la « solution » (les complexes) n'est pas pratique...



Qu'est-ce qu'elle a de non pratique ? les complexes permettent de completer
R vis-a-vis des equations algebriques, et tout marche. C'est un domaine ou
il n'y a plus aucun souci depuis tres longtemps, et ca donne des choses tres
interessantes, comme les integrales de lacets, les developpements en serie
entiere et plein de choses sympa (exemples non pris au hasard, vu que ca
fait partie de l'attirail de l'evaluation des O(n) pour les cas un peu
compliques).

Comparativement, on sait faire nettement moins de choses avec les nombres
entiers...
Avatar
Samuel DEVULDER
Antoine Leca a écrit :
Samuel DEVULDER écrivit :
sqrt(2) [...]


Et c'est même pire.. Il y a quelques milliers d'années, à l'époque de
pythagore, certains pensaient que sqrt(2) n'était pas un nombre car il n
n'entrait pas dans les calculs et la vision du monde de l'époque.

Pour nous, à notre époque, on a pas tellement évolué: on a juste
remplacé 2 par -1!



En même temps cela fait plus de 100 ans que ce « problème » est résolu ;



Oui mais non, car sitôt qu'on accepte une extension à un nombre, on
invente une autre classe de "choses" qui pourraient être des nombres,
mais qu'on a encore du mal à imaginer ou manipuler aussi facilement
qu'on le fait avec les choses acceptées comme nombres, voir qui choquent
tellement l'intuition qu'on se faisait des nombre auparavant, qu'on les
rejette. Par exemple: les ordinaux, ou les "choses" qui se baladent dans
le halo autour des nombres rééls dans l'analyse non standard.

Evidemment, aucune de ces choses "infinitésimale" n'a de représentation
en base dix ou deux, mais je ne serais pas étonné d'apprendre que
1.000...???...0000<chiffres en nb finis> (avec ??? représentant une
certaine infinité de zero) puisse correspondre avec l'une des partie des
éléments du halo.

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

Antoine Leca a écrit :
Samuel DEVULDER écrivit :
sqrt(2) [...]


Et c'est même pire.. Il y a quelques milliers d'années, à l'époque de
pythagore, certains pensaient que sqrt(2) n'était pas un nombre car il n
n'entrait pas dans les calculs et la vision du monde de l'époque.

Pour nous, à notre époque, on a pas tellement évolué: on a juste
remplacé 2 par -1!








Surtout, on a arrêté de trop mélanger une vision philosophique ou
(méta-)physique du monde à l'activité mathématique. Si on a besoin d'un
objet mathématique qui a telle et telle propriété, on va s'attacher à le
construire, ce qui est déjà suffisament difficile, sans s'occuper de
savoir en plus ce qu'en penseraient les philosophes.

En même temps cela fait plus de 100 ans que ce « problème » est résolu ;



Oui mais non,



... mais oui. Sérieusement, les complexes ne posent plus de problème depuis
bien longtemps.

car sitôt qu'on accepte une extension à un nombre, on
invente une autre classe de "choses" qui pourraient être des nombres,
mais qu'on a encore du mal à imaginer ou manipuler aussi facilement
qu'on le fait avec les choses acceptées comme nombres, voir qui choquent
tellement l'intuition qu'on se faisait des nombre auparavant, qu'on les
rejette. Par exemple: les ordinaux, ou les "choses" qui se baladent dans
le halo autour des nombres rééls dans l'analyse non standard.



Bah, le principal problème dans ce paragraphe semble être de
vocabulaire, à savoir qu'est-ce qu'on peut appeler « nombre ». La
majorité des mathématiciens que je connais ne se posent pas ce genre de
question et parlent d'entiers, de rationnels, de réels, de complexes,
d'algébriques, de p-adiques, d'entiers modulo n, sans se demander s'il
méritent plus l'appellation de « nombre » que des polynômes ou des
points sur une courbe.

Bref, ce genre de question n'a pas d'intérêt mathématique, et encore
moins de lien avec le C, sauf si on veut étudier les façons de
réprésenter en mémoire ces objets et les différences entre, par exemple
le type double du C et l'objet mathématique abstrait « ensemble des
nombres réels », ce qui était en partie l'objet initial de cette
enfilade.

Evidemment, aucune de ces choses "infinitésimale" n'a de représentation
en base dix ou deux,



Par définition, les nombres réels sont exactement ceux qui admettent un
développement décimal (en la base qu'on veut sauf 1) éventuellement
infini.

mais je ne serais pas étonné d'apprendre que
1.000...???...0000<chiffres en nb finis> (avec ??? représentant une
certaine infinité de zero) puisse correspondre avec l'une des partie des
éléments du halo.



Non, le coup d'une infinité de zéros avec un truc après n'a pas de sens
dans ce contexte.

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Avatar
Antoine Leca
Marc Espie écrivit :
In article <hpmoe0$quk$,
Antoine Leca wrote:
sqrt(2) [...]


Pour nous, à notre époque, on a pas tellement évolué: on a juste
remplacé 2 par -1!


En même temps cela fait plus de 100 ans que ce « problème » est résolu ;
mais évidemment la « solution » (les complexes) n'est pas pratique...



Qu'est-ce qu'elle a de non pratique ?



Bin, c'est moins pratique que les réels.
Par exemple, pour les ordinateurs cela demande de manipuler *deux*
quantités en virgule flottante pour obtenir une approximation permettant
de faire des « calculs ». Le résultat, c'est que des gens informés et
compétents ne pensent même pas que les complexes puissent exister.

Un autre aspect c'est que cela ne s'accorde pas super bien avec la
notion d'un univers physique en « trois dimensions ». Mais bon, on va
pas dériver par là, parce que cela n'a plus aucun rapport avec le sujet.


les complexes permettent de completer R vis-a-vis des equations algebriques,



[snip] Oui, c'était le sens de ma réponse (trop laconique semble-t-il).


Antoine