Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
720 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] conversion double en int ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] conversion double en int ?

n°700423
ofbdood
Posté le 15-04-2004 à 17:38:48  profilanswer
 

slt à tous,
 
voilà j'ai un petit problème, je vous montre

Code :
  1. double rnd_tmp;
  2. rnd_tmp = rand()*nb_colors;
  3. rnd_tmp = floor(rnd_tmp);
  4. tab_code[i] = tab_colors[rnd_tmp];


 
donc en fait je génère un nombre aléatoire (entre 0 et 1), je le multiplie par le nombre de couleurs et je l'arrondis. Ensuite avec ce nombre arrondi (donc qui est un pseudo entier) je selectionne un index du tableau.
Le problème ce que pour un index il faut un "vrai" int et non pas un double du genre 5.00.
 
Voilà mon petit problème si quelqu'un à la solution :)
 
merci d'avance !

mood
Publicité
Posté le 15-04-2004 à 17:38:48  profilanswer
 

n°700424
Taz
bisounours-codeur
Posté le 15-04-2004 à 17:41:20  profilanswer
 

quel est le problème ? ensuite tu fous tout ça dans un int et voilà ... enfin size_t plutot. fait attention aux débordements.
 
ton usage de rand est mauvais
 

Citation :

      Dans Numerical Recipes in C: The Art of Scientific  Computing  (William
       H.  Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling;
       New York: Cambridge University Press, 1990 (1st ed, p. 207)),  le  com‐
       mentaire suivant apparaît :
              "Si  vous  désirez  engendrer un entier aléatoire entre 1 et 10,
              vous devez toujours procéder en  utilisant  les  bits  de  poids
              forts, comme dans :
                                                                                 
                     j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
                                                                                 
              et jamais ainsi :
                                                                                 
                     j=1+(rand() % 10);
                                                                                 
              (car cette derniere version utilise les bits de poids faibles)."
                                                                                 
       La génération de nombres aléatoires est un domaine complexe.  Le  livre
       Numerical  Recipes  in  C  (référence ci-dessus) fournit une excellente
       présentation pratique d?un générateur  aléatoire  dans  le  chapitre  1
       (Random Numbers).

n°700430
ofbdood
Posté le 15-04-2004 à 17:50:02  profilanswer
 

bah oui mais si je mets ça dans un int tout bêtement il me sort un warning... ça fait pas très propre :p
(conversion from 'double' to 'int', possible loss of data)


Message édité par ofbdood le 15-04-2004 à 17:50:22
n°700434
Taz
bisounours-codeur
Posté le 15-04-2004 à 17:56:12  profilanswer
 

bah ouais ... faut caster un peu bourrin. commence par faire une fonction qui te renvoie un entier aléatoire déjà. ensuite utilise là. ou alors utiliser stl/boost/sgi y a tout ce que tu veux pour sélectionner au hasard un élément dans une séquence


Message édité par Taz le 15-04-2004 à 17:57:15
n°700437
ofbdood
Posté le 15-04-2004 à 17:59:57  profilanswer
 

oué ok je vais voir tout ça
d'ailleurs ça m'a l'air pas mal ça : http://home1.gte.net/deleyd/random/crandom.html
 
merci pour ton aide

n°700438
Taz
bisounours-codeur
Posté le 15-04-2004 à 18:00:50  profilanswer
 

c'est exactement ce que je t'ai conseillé

n°700447
ofbdood
Posté le 15-04-2004 à 18:09:53  profilanswer
 

j'ai pas dis le contraire, c'était dans ma recherche en parallèle :p
 
voilà ça me donne ça :

Code :
  1. double rnd_tmp;
  2.  int rnd_index;
  3.  srand(10000);
  4.  rnd_tmp = ((double)rand()/(double)(RAND_MAX+1));
  5.  rnd_tmp = rnd_tmp * nb_colors;
  6.  rnd_index = (int)rnd_tmp;
  7.  tab_code[i] = tab_colors[rnd_index];


 

n°700449
Taz
bisounours-codeur
Posté le 15-04-2004 à 18:12:03  profilanswer
 

voilà. maintenant encapsule tout ça dans une fonction pour que ça fasse plus propre

n°700456
ofbdood
Posté le 15-04-2004 à 18:21:35  profilanswer
 

Oui c'est déjà dans une fonction sauf que j'ai pas tout copié...

n°700458
fli
Posté le 15-04-2004 à 18:28:24  profilanswer
 

ofbdood a écrit :

j'ai pas dis le contraire, c'était dans ma recherche en parallèle :p
 
voilà ça me donne ça :

Code :
  1. double rnd_tmp;
  2.  int rnd_index;
  3.  srand(10000);
  4.  rnd_tmp = ((double)rand()/(double)(RAND_MAX+1));
  5.  rnd_tmp = rnd_tmp * nb_colors;
  6.  rnd_index = (int)rnd_tmp;
  7.  tab_code[i] = tab_colors[rnd_index];


 
 


Je me permettrais juste 2 remarques :
- il vaut mieux utiliser une valeur variable ppour ton srand() plutot qu'une valeure fixe. Par exemple un compteur système ou tout simplementl'heure
- tu n'es pas obligé d'utiliser autant de variable, tu peux même tout écrire, le cast y compris en une ligne, mais ça c'est plus une question de gout :)
 
bonne continuation


Message édité par fli le 15-04-2004 à 18:29:21
mood
Publicité
Posté le 15-04-2004 à 18:28:24  profilanswer
 

n°700470
cricri_
Posté le 15-04-2004 à 18:44:02  profilanswer
 

Mais là tu auras une troncature, pas un arrondi, il faut ajouter ou retrancher 0.5 suivant le signe, dans ton cas rajouter suffit :

Code :
  1. rnd_tmp = rnd_tmp * nb_colors + 0.5;

n°700473
Taz
bisounours-codeur
Posté le 15-04-2004 à 18:45:22  profilanswer
 

floor et ceil sont là :o

n°700482
cricri_
Posté le 15-04-2004 à 18:53:37  profilanswer
 

Désolé mais ça ne fait pas vraiment un arrondi dans le principe ça ...
Je préfère ma méthode ;)

n°700489
ofbdood
Posté le 15-04-2004 à 19:01:05  profilanswer
 

Vous battez pas :p, dans mon cas ça n'a que peu d'importance (du moment que j'adapte correctement derrière)
 
pour le srand effectivement je vais mettre l'heure parce que là, la première fois il me resort tjs la même combinaison (ce qui est logique en fait)
 
Pour ce qui est de l'écriture pour l'instant je fais mon petit truc et quand tout marchera bien j'optimiserais un peu :)

n°700591
Taz
bisounours-codeur
Posté le 15-04-2004 à 22:29:08  profilanswer
 

Cricri_ a écrit :

Désolé mais ça ne fait pas vraiment un arrondi dans le principe ça ...
Je préfère ma méthode ;)
 

ben alors tu utilises round :o

n°700662
sanglier04
Posté le 16-04-2004 à 00:16:25  profilanswer
 

Question peut être un peu stupide, mais pourquoi ne faut'il pas utiliser les bit de poids faibles ?

n°700684
djdie
L'heure, c'est l'heure.
Posté le 16-04-2004 à 01:19:49  profilanswer
 

Ben c'est écrit dans le lien donné plus haut http://home1.gte.net/deleyd/random/crandom.html
 
C'est parce que, dans une implémentation souvent utilisée de générateur de nombres pseudo-aléatoires, les bits de poids faibles ont tendance à être "moins aléatoires" que ceux de poids fort.

n°700742
cricri_
Posté le 16-04-2004 à 09:18:10  profilanswer
 

Taz a écrit :

ben alors tu utilises round


zarbi je ne trouve pas ... c'est standard ça ??

n°700746
jeoff
Posté le 16-04-2004 à 09:23:11  profilanswer
 

Citation :

Note: on Microsoft Visual C++ 6.0, if seed is negative than a seed value from the system clock is used. Also check for a randomize() function on your compiler.


 
Ca veut dire que un random avec seed=-1 choppe lheure système en lieu et place de -1 sous VC++ ?

n°701014
Taz
bisounours-codeur
Posté le 16-04-2004 à 13:33:19  profilanswer
 

cricri_ a écrit :


zarbi je ne trouve pas ... c'est standard ça ??

C99

n°702218
christophe​_d13
L'efficacité à tout prix.
Posté le 18-04-2004 à 16:21:18  profilanswer
 

Petites simplifications...
 
double fdRoundTemp;  
srand(10000);  //Ou le le timer
 
fdRoundTemp = ((double)rand()/(double)(RAND_MAX+1));  
fdRoundTemp *= (double)lNbColors;  
tab_code[i] = tab_colors[(long)fdRoundTemp];
 
PS:le int à un problème, sur certains compilateurs, il est en 16, 24, 32, 48 voire 64 bits... Avec un long (ou un short), pas de problème

n°702221
Taz
bisounours-codeur
Posté le 18-04-2004 à 16:26:33  profilanswer
 

christophe_d13 a écrit :


PS:le int à un problème, sur certains compilateurs, il est en 16, 24, 32, 48 voire 64 bits... Avec un long (ou un short), pas de problème

même problème avec les long
 
le type a utilisé est size_t .|

n°702223
skelter
Posté le 18-04-2004 à 16:30:42  profilanswer
 

oui, short est fixé a 16 bits mais long est le type natif, 32 bits sur les machines 32 bits, 64 pour les machines 64 bits ...

n°702228
Taz
bisounours-codeur
Posté le 18-04-2004 à 16:42:29  profilanswer
 

rien ne dit ça ... il y a juste des exigences de minima et de relation d'ordre dans les sizeof, rien de plus.

n°702232
christophe​_d13
L'efficacité à tout prix.
Posté le 18-04-2004 à 16:52:09  profilanswer
 

PS: long est au minimum en 32 bits... alors que int varie.
malheureusement l'ansi n'a pas fixée et normalisée le type 32 et 64 bits... Résultat avec GCC pour le 64 bits on fait du "long long" et "__int64" avec VC.
 
Mais on s'éloigne du sujet.

n°702249
Taz
bisounours-codeur
Posté le 18-04-2004 à 17:30:35  profilanswer
 

mais le long long est standard :o
 
non, on ne s'éloigne pas. tu nous fais toi même la démonstration du flou qu'il existe, t'essaie de te rattraper aux branches. moi je dis "utilise size_t", ce type entier non-signé est fait pour ça

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] conversion double en int ?

 

Sujets relatifs
conversion d'un *char en flottant dans un tableau[C++] nombre de décimaux dans un double qu'on écrit dans un fichier
conversion des scancodesconversion string -> char *
petite conversion asm -> hexaconvertir un string en double, question API
[ASM] Conversion entier en chaine decimal[C] Question sur strtol (conversion de char* en int)
Conversion planètaire -> planaireconversion date
Plus de sujets relatifs à : [C++] conversion double en int ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR