Problème de conversion de float en int

Problème de conversion de float en int - C++ - Programmation

Marsh Posté le 03-03-2003 à 16:28:54    

Salut !
 
J'ai un float que j'obtiens en divisant 0.1 par 0.1. Le résultat est donc 1. Quand je met cette valeur dans un int, il se converti en 0. Je suppose donc qu'en fait il vaut un peu moins de 1 et qu'il est tronqué quand il est converti en int :??:
 
Comment résoudre mon problème, sachant que je ne veux pas obtenir de float vu que ca doit me donner la taille d'un tableau ?

Reply

Marsh Posté le 03-03-2003 à 16:28:54   

Reply

Marsh Posté le 03-03-2003 à 16:32:10    

Tu peux utiliser ceil() ou floor()


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 03-03-2003 à 16:40:27    

Tetragrammaton IHVH a écrit :

Tu peux utiliser ceil() ou floor()


 
Ce sont des fonctions d'arrondi ?
C'est ce que je cherchais en ce moment, mais je ne comprend pas pourquoi ça me donne ce 0 :??:

Reply

Marsh Posté le 03-03-2003 à 16:51:07    

ben visiblement il arrondi pas, il converti au int inferieur
 
ceil et floor arrondissent pas non plus, se contentent de convertir au int superieur/inferieur


Message édité par chrisbk le 03-03-2003 à 16:51:43
Reply

Marsh Posté le 03-03-2003 à 17:27:49    

Pour arrondir, il suffit de faire un floor(x+0.5), ou ceil(x-0.5)


Message édité par dsls le 03-03-2003 à 17:28:47
Reply

Marsh Posté le 03-03-2003 à 17:33:20    

cela dépend comment tu fais ton calcul je pense
 
si tu fais
 

Code :
  1. float a,b,c;
  2. int i;
  3. a=0.1;
  4. b=0.1;
  5. i=a/b;


 
cela risque de ne pas fonctionner
 
par contre as-tu essayé :
 

Code :
  1. float a,b,c;
  2. int i;
  3. a=0.1;
  4. b=0.1;
  5. c=a/b;
  6. i=(int)c;


 
sinon utilise math.h pour utiliser floor ou ceil
 
a++
 

Reply

Marsh Posté le 03-03-2003 à 17:49:54    

En fait je me suis trompé, je suis en double, j'ai :
 
double a = 0.1;
double b = 0.2;
 
a /= b;
 
void fonction(int nb)
{
...
int tab[a];
}
 
et je fais :
 
fonction (a);
 
Mais une fois dans le corps de la fonction, a est égal à 0...
 
Maintenant le programme ne plante plus, mais j'aimerais bien comprendre :(

Reply

Marsh Posté le 03-03-2003 à 19:10:19    

ben deja 0.1/0.2 ca donne 0.5 et non pas 1..
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 03-03-2003 à 19:16:33    

legreg a écrit :

ben deja 0.1/0.2 ca donne 0.5 et non pas 1..
 
LeGreg


 
:lol:

Reply

Marsh Posté le 03-03-2003 à 22:46:30    

legreg a écrit :

ben deja 0.1/0.2 ca donne 0.5 et non pas 1..
 
LeGreg


 
 
 :jap:

Reply

Marsh Posté le 03-03-2003 à 22:46:30   

Reply

Marsh Posté le 04-03-2003 à 09:22:16    

legreg a écrit :

ben deja 0.1/0.2 ca donne 0.5 et non pas 1..
 
LeGreg


 
C'est mon clavier qui ne marque pas ce que je veux :D
 
Je voulais bien sûr dire 0.1/0.1 ;)

Reply

Marsh Posté le 23-03-2003 à 02:47:11    

raph77 a écrit :

J'ai un float que j'obtiens en divisant 0.1 par 0.1. Le résultat est donc 1.

Les flottants on une représentation binaire et ne peuvent représenter que des combinaisons de divisions par 2.
0.1 (écrit dans le source) ne vaut pas 0.1, mais 0.10000000000000001.
 
Cela dit, x/x devrait effectivement donner exactement 1. Et c'est effectivement la cas chez moi.
 
Soit ton processeur manque singulièrement de précision en virgule flottante.
Soit tes deux 0.1 ne sont pas obtenus de la même façon et sont différents.
Soit ton compilateur fait des bizarreries (vu avec Visual C++ 6 sans service pack).
 
 
ceyquem: ce que tu propose ne change rien.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 23-03-2003 à 10:30:46    

En modifiant ce que dit plus haut
 
Code :
 
  float a,b,c;
  int i;
   
  a=0.1;
  b=0.1;
  c=a/b;
  i=(int)(c + 0.5f); /* pour forcer à l'int POSITIF proche */
?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed