égalité de float c++

Greggygreg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
Greggygreg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, j'ai un soucis, dans un programme, je récupère des floats, et je voudrai savoir si les valeurs sont égales. Alors que je peux vérifier qu'elles ne le sont pas, mon programme m'indique que la soustraction vaut toujours zéro...
Voici le code et le résultat :
(D0 est équivalent à D1 mais récupéré avant)

float** D1=ComptonScattering->GetHotSpot();
float kiki=*D1[0];
float koko=*D0[0];
float mich=*D1[0]-*D0[0];
printf("kiki = %f \t koko = %f \t %f",kiki,koko,mich);
cout<<*D0[0]<<"\t"<<*D0[1]<<"\t"<<*D0[2]<<endl;
cout<<*D1[0]<<"\t"<<*D1[1]<<"\t"<<*D1[2]<<endl;


et j'obtiens :

kiki = 0.000000 	 koko = 0.000000 	 0.000000
7.16186e-13	0	0
1.01094e-12	0	0


(D0 et D1 pour 1 et 2, ça vaut zéro c'est normal)
Donc alors que j'ai bien des valeurs différente, j'obtiens toujours des zéros.
Si je fais un
 cout<<*D1[0]-*D2[0]<<endl; 
j'ai encore zéro.

Je ne sais plus quoi faire pour obtenir la différence des deux. Vous pouvez m'aider ?
Merci

3 réponses

Groarh Messages postés 682 Date d'inscription   Statut Membre Dernière intervention   185
 
En fait tu n'as pas zéro.
La différence entre tes deux float est un nombre très très proche de zéro, du coup ça ne se voit pas à l'affichage.

On parle parfois de représentation approchée pour désigner les formats float, double, etc. Ce terme est pertinent car il est impossible d'avoir une précision absolue en informatique.
Le problème du zéro est un des inconvénients du format float utilisé en C++ (il s'agit de la norme IEEE 754).

Ce qui est amusant c'est que le printf est moins « sensible » que le cout. Tu as essayé avec %d ?

Pour répondre à ta question, je te conseille de convertir tes nombres en double avant de les soustraire, ça te donnera un résultat plus précis et tu verras peut-être quelque chose.

:)
0
Greggygreg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Le problème ne vient pas de la précision je pense (bien qu'effectivement, il est surprenant que cout soit plus précis que %f...)

Parce que si tu veux, j'obtiens ça :
float kiki=(*D1[0])*100000000000; 
// je tente d'augmenter pour voir si c'est un problème de précision
float koko=(*D0[0])*100000000000;
cout<<*D0[0]<<"\t"<<*D0[1]<<"\t"<<*D0[2]<<endl;
cout<<*D1[0]<<"\t"<<*D1[1]<<"\t"<<*D1[2]<<endl;
float mich=kiki-koko;
printf("kiki = %f \t koko = %f \t %f \n",kiki,koko,mich);

7.16186e-13	0	0
1.01094e-12	0	0
kiki = 0.101094 	 koko = 0.101094 	 0.000000 

Donc, on a bien *D1[0] différent de *D0[0] (1ère et 2ème ligne) mais sur la 3ème ligne, il me met que *D0[0]=*D1[0]. Pourquoi il ne me garde pas la valeur de *D0 ?

Pour obtenir D0, je récupère un tableau de 3 case d'une matrice codé ailleurs, j'effectue des modifications sur la matrice, et je récupère le même tableau après récupération dans D1.

Donc en fait, pourquoi il ne me change ma valeur de D0 ?
0
Greggygreg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Non en fait c'est bon, un problème de déclaration dynamique, il n'y avait pas de copie du coup ça me changeait la valeur de D0 trop tôt, j'ai déclaré koko plus haut, juste après avoir D0 et avant l'opération sur la matrice et maintenant ça marche.
Merci quand même Groah
0