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
espie
In article <4bbf1aa7$0$14945$,
Samuel DEVULDER wrote:
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.



Non, non, c'est du grand n'importe quoi, ce que tu affirmes. Les "nombres"
qui ont ete rajoutes correspondent a des besoins pratiques tres precis.

La plupart des gens n'ont pas besoin d'ordinaux (de toutes facons, la plupart
des gens n'ont jamais appris a raisonner sur la notion d'infini). L'analyse
non-standard n'est pas forcement un objet utile, ca tout le monde le sait
(mais grace a la theorie des modeles, on sait aussi qu'elle ne sert a rien,
stricto-sensu, puisque tout resultat prouvable dans ycelle se prouve SANS
analyse non-standard).

Je dirais meme plus: on a aujourd'hui une vision bien plus pratique et
effective des nombres. On sait ce qui est rationnel, denombrable, mesurable,
algebrique, transcendant... ou complexe. Beaucoup de notions se sont
simplifiees durant les 150 dernieres annees (genre, on comprend bien mieux
la notion de limite. Ou alors, l'integrale, qui a connu de grosses
simplifications d'usage avec Lebesgue). Les "nouveaux" objets (distributions,
fractales, champs de vecteurs...) correspondent a de nouvelles applications.

Au final, on est passe d'un reel simplifie, tres newtonien dans son esprit,
au foisonnement chaotique du monde reel, avec ses turbulences et ses petits
problemes de discretisation.

Bienvenue sur Terre. ;-)

(follow-up to n'importe ou, ca n'a vraiment plus aucun rapport avec le C).
Avatar
Samuel DEVULDER
Manuel Pégourié-Gonnard a écrit :

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



Il y a bien d'autres choses que les complexes ou les rééls. La droite
des réels est pleine de trous pour certains types de mathématiques.

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



Un nombre est à l'origine un truc pour mesurer et comparer des
grandeurs. La notion de nombre n'a cessé d'évoluer, passant des entiers,
des rationnels jusqu'aux réels. Dès qu'on croit être satisfait et avoir
précisément défini ce qu'est un nombre, voila qu'on trouve un autre truc
très utile pour le calcul de grandeurs et qui ne rentre pas dans ce
qu'on avait défini comme étant un nombre.

Un exemple: pour les fonctions peignables (combable functions, des
fonctions qui grossisent régulièrement à l'infini si je me souviens
bien), le taux de croissance à l'infini représente une sorte de nombre.
C'est assez rigolo car on y retrouve tous les réels: au polynome
x^alpha, on associe le réel alpha. Mais il y a des trucs en plus. A quel
nombre correspond ln(x)*x^alpha? En fait si on compare (divisision et
limite à l'infini pour ces fonctions) avec x^alpha, à l'infini ca
diverge, c'est donc un nombre strictement supérieur à alpha. Mais si on
compare avec x^(alpha+epsilon), à l'infini ca tends vers zero, et cela
quelque que soit epsilon aussi petit qu'on veut. C'est donc un nombre
plus grand que alpha et plus petit que tout reel supérieur à alpha. On
vient de sauter le pas dans l'analyse non standard sans s'en rendre compte!

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.



En fait non. Ils parlent d'un "objet" mathématique, qui est beaucoup
plus général qu'un nombre. Le nombre sert je pense surtout quand on veut
classer ou mesurer des trucs, bref à les placer sur l'axe des reels.

A noter que d'après cela les complexes ne sont pas des nombres: on a pas
de relation d'ordre total qui soit compatible avec la structure de
corps. En pratique il faut d'ailleurs deux *nombres* pour placer un
complexe dans le plan.

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.



Ben les trucs avec des infinis ne rebutent pas trop certains
mathématiciens, et on fait même des systèmes informatiques qui manipules
de telles entités très exactement et sans gros soucis.

sam.
Avatar
Vincent Lefevre
Dans l'article <hpn9j3$scq$,
Manuel Pégourié-Gonnard écrit:

Par définition,



Pas vraiment "par définition", car ce n'est pas une des définitions
usuelles (même si on s'y rapproche).

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



Si c'est un développement décimal, la base est forcément 10. :)
Mais bon, la norme C fait le même genre d'erreur ("decimal-point
character"), mais probablement à cause du decimal_point qui était
là avant le format hexa.

--
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 <hpnbc0$7n2$,
Antoine Leca écrit:

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.



Et la définition des modes d'arrondi sur les complexes est assez
foireuse.

--
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
Marc Espie a écrit :

Non, non, c'est du grand n'importe quoi,



Pourquoi? Tu est trop péremptoire.

ce que tu affirmes. Les "nombres"
qui ont ete rajoutes correspondent a des besoins pratiques tres precis.



et c'est contraire à ce que j'ai dit? J'ai écrit un autre message ou je
détaille, si tu veux des précisions.

La plupart des gens n'ont pas besoin d'ordinaux (de toutes facons, la plupart
des gens n'ont jamais appris a raisonner sur la notion d'infini). L'analyse
non-standard n'est pas forcement un objet utile, ca tout le monde le sait
(mais grace a la theorie des modeles, on sait aussi qu'elle ne sert a rien,
stricto-sensu, puisque tout resultat prouvable dans ycelle se prouve SANS
analyse non-standard).



Ca n'est pas parce que ca ne te sert pas que ca n'existe pas ou que ca
n'a aucun intérêt. Tu serais musicien à l'époque de pythagore, tu dirais
que le nombre qu'ils appellent "racine de deux" ne sert pas, personne
n'en entend parler ou n'en a besoin pour son "art", et du reste on ne
sait même pas le mettre en proportion avec les autres nombres. C'est du
grand n'importe quoi ce nombre. Et pourtant... 2000ans après c'est une
autre histoire.

Je dirais meme plus: on a aujourd'hui une vision bien plus pratique et
effective des nombres. On sait ce qui est rationnel, denombrable, mesurable,
algebrique, transcendant... ou complexe. Beaucoup de notions se sont
simplifiees durant les 150 dernieres annees (genre, on comprend bien mieux
la notion de limite. Ou alors, l'integrale, qui a connu de grosses
simplifications d'usage avec Lebesgue). Les "nouveaux" objets (distributions,
fractales, champs de vecteurs...) correspondent a de nouvelles applications.



Absolument et ca n'est pas contraire à ce que j'ai dit. Ou alors nous
écrivons tous les deux du grand n'importe quoi.

(follow-up to n'importe ou, ca n'a vraiment plus aucun rapport avec le C).



Mais tu l'as dit toi même, c'est du grand n'importe quoi..

sam.
Avatar
Richard Delorme
Le 09/04/2010 17:03, Samuel DEVULDER a écrit :

Un nombre est à l'origine un truc pour mesurer et comparer des
grandeurs.



À l'origine (comme décrit dans Euclide, p.ex.), on n'appelait nombre ce
qui servait à compter et qu'on appelle aujourd'hui entier naturel et
grandeur (ou magnitude pour reprendre le radical latin) ce qui servait à
mesurer et qu'on appelle aujourd'hui un réel.

--
Richard
Avatar
Manuel Pégourié-Gonnard
Vincent Lefevre scripsit :

Dans l'article <hpn9j3$scq$,
Manuel Pégourié-Gonnard écrit:

Par définition,



Pas vraiment "par définition", car ce n'est pas une des définitions
usuelles (même si on s'y rapproche).



J'avais failli dire « (presque) par définition », visiblement j'aurais
du. Disons que c'est une définition possible, dont l'équivalence avec
une définition plus usuelle (complété de Q pour la valeur absolue
usuelle) est assez immédiate.

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



Si c'est un développement décimal, la base est forcément 10. :)
Mais bon, la norme C fait le même genre d'erreur ("decimal-point
character"), mais probablement à cause du decimal_point qui était
là avant le format hexa.



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
t'accorde que la terminologie est malheureuse, mais c'est celle qui me
semble la plus commune. Si tu en as une plus claire à proposer, je suis
preneur.

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

Manuel Pégourié-Gonnard a écrit :

la majorité des mathématiciens que je connais [...]


En fait non.



Si tu veux m'apprendre des trucs sur « la majorité de mathématiciens que
je connais », on va avoir un problème, parce que par définition je les
connais mieux que toi :-)

Ils parlent d'un "objet" mathématique, qui est beaucoup
plus général qu'un nombre.



Ceci dit, là on est d'accord. On se fiche royalement de savoir si les
objets manipulés sont des nombres ou pas. Si les objets nous
intéressent, on les manipule, sinon on les laisse tranquilles.

Mon point était que parmi les objets manipulés, peu importe de savoir
ceux qui méritent om pas d'être appelés « nombres ». Quand ça nous
arrange d'y penser comme des nombres, on le fait, sinon on le fait pas.

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.



Ben les trucs avec des infinis ne rebutent pas trop certains
mathématiciens,



J'ai dit « dans ce contexte ». Rassure-toi, j'ai déjà entendu parler de
trucs « avec des infinis » et ils ne me rebutent pas. Ce n'est pas pour
autant qu'on peut en faire ce qu'on veut dans tous les contextes.

Bref, je ne vois pas trop où tu veux en venir, à part lancer en l'air
des tas de mots-clés... Sauf si ton point est de dire qu'il existera
toujours des problèmes ouverts en math et qu'on inventera toujours de
nouveaux objets pour les résoudre, mais là ça me paraît assez évident
pour ne pas avoir besoin d'argumenter trop longtemps.

--
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 :
Samuel DEVULDER scripsit :

Manuel Pégourié-Gonnard a écrit :

la majorité des mathématiciens que je connais [...]


En fait non.



Si tu veux m'apprendre des trucs sur « la majorité de mathématiciens que
je connais », on va avoir un problème, parce que par définition je les
connais mieux que toi :-)



Ah? On fais un concours de celui qui a le plus gros nombre Erdös[*]? lol ;-)

S'il te plait, ne coupe pas là ou tu as envie pour polémiquer, ca ne
rends service à personne.
____
[*] contrairement à d'autre domaines, le nombre Erdös est avantageux
quand il est petit.

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

Samuel DEVULDER scripsit :

Manuel Pégourié-Gonnard a écrit :

la majorité des mathématiciens que je connais [...]


En fait non.



Si tu veux m'apprendre des trucs sur « la majorité de mathématiciens que
je connais », on va avoir un problème, parce que par définition je les
connais mieux que toi :-)



Avant qu'un petit malin ne vienne me le faire remarquer : ok, il est
théoriquement possible que tu connaisses tous les mathématiciens que je
connais, et mieux que moi. Il est également possible en pratique que
j'ai une légère tendance à abuser de l'expression « par définition » :-)

Donc, même si je pense que le fond de ma pensée était clair, je
reformule : ce que je retire de mes échanges avec d'autres
mathématiciens, c'est que de nos jours, on manipule des objets
mathématiques variés sans trop se soucier de savoir lesquels sont des
« nombres » ou autre question « philosophique » sur leur nature et leur
légitimité. (On peut en parler à table ou à la machine à café, mais dans
l'immense majorité des cas, quand on est réellement en train de
travailler, on s'en fiche.) Et tu ne réussiras pas à me convaincre qu'il
se dégage autre chose de mon expérience personnelle :-)

Bref, pour en revenir à ta remarque initiale :

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!



Si, à notre époque, on a vraiment évolué : on ne refuse plus
« bêtement » une légitimité à tel ou tel objet mathématique pour des
raisons « philosophiques ».

C'est ça la grosse différence par rapport aux problèmes que les
pythagoriciens avaient avec les irrationnels, plus que le fait que la
variété des objets qu'on considère de nos jours est bien plus vaste que
celle qu'ils connaissaient à l'époque.

Parmi la grande variété des objets mathématiques qu'on utilise, il y en
a qui sont encore mal compris ou difficiles à manipuler techniquement.
Mais les complexes n'en font pas partie, bien au contraire.

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