é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 -
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)
et j'obtiens :
(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
Je ne sais plus quoi faire pour obtenir la différence des deux. Vous pouvez m'aider ?
Merci
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
A voir également:
- égalité de float c++
- Afficher un float en c ✓ - Forum C++
- C++ Chiffres d'un float ✓ - Forum C++
- C++ limitation affichage float ✓ - Forum C++
- Afficher un float avec 2 chiffres après la virgule en c ✓ - Forum C++
- Float java ✓ - Forum Java
3 réponses
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.
:)
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.
:)
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 :
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 ?
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 ?