[c] conversion double -> int

conversion double -> int [c] - C - Programmation

Marsh Posté le 05-05-2004 à 16:08:59    

Bonjour à tous !
 
alors j'ai une fonction toute simple de ce type la :
 

Code :
  1. int CalculIndiceFreq (double frequence, double startFreq, double stepFreq)
  2. {
  3. int ret;
  4. printf("%f\n",(frequence-startFreq)/(stepFreq));
  5. ret = (frequence-startFreq)/(stepFreq);
  6. printf("%d\n\n", ret);
  7. return ret;
  8. }


 
et en l'appelant plusieurs fois, j'obtiens ces résultats la :
 
1.000000
0
 
21.000000
20
 
7.000000
7
 
25.000000
24
 
4.000000
4
 
Ma question est : d'ou viens le problème de conversion et comment résoudre ce problème ?  
 
On vois qu'à la conversion, mon int perd parfois une unité et parfois il n'en perd pas ...


Message édité par fif_x le 05-05-2004 à 16:10:12
Reply

Marsh Posté le 05-05-2004 à 16:08:59   

Reply

Marsh Posté le 05-05-2004 à 16:12:01    

utilise floor / ceil

Reply

Marsh Posté le 05-05-2004 à 16:21:13    

ces fonctions se trouvent bien dans math.h ????
 
Mon compilateur ne fait aucune référence vers floor :(

Reply

Marsh Posté le 05-05-2004 à 16:22:46    

-lm

Reply

Marsh Posté le 05-05-2004 à 16:31:35    

En fait le système fait une troncature quand on convertit un flottant en entier, la dernière fois Taz avait aussi parlé de round(), perso je fais +/- 0.5 pour faire un arrondi.

Reply

Marsh Posté le 05-05-2004 à 16:33:21    

merci Taz, je pense que ces fonctions peuvent m'aider mais meme en modifiant ma fonction :

Code :
  1. int CalculIndiceFreq (double frequence, double startFreq, double stepFreq)
  2. {
  3. int ret;
  4. double temp;
  5. printf("%f\n",(frequence-startFreq)/(stepFreq));
  6. temp = ((frequence-startFreq)/(stepFreq));
  7. temp = floor (temp);
  8. ret=temp;
  9. printf("%d\n\n", ret);
  10. return ret;
  11. }


 
J'ai toujours les mêmes erreurs :(

Reply

Marsh Posté le 05-05-2004 à 16:35:15    

Reply

Marsh Posté le 05-05-2004 à 16:36:32    

Nan, la référence marche bien, j'arrive à accéder à la fonction floor, mais mes résultats restent malgré tout les mêmes.

Reply

Marsh Posté le 05-05-2004 à 17:06:46    

J'ai résolu le problème en trichant bien :

Code :
  1. int CalculIndiceFreq (double frequence, double startFreq, double stepFreq)
  2. {
  3. int ret;
  4. double temp;
  5. printf("%f\n",(frequence-startFreq)/(stepFreq));
  6. temp = ((frequence-startFreq)/(stepFreq))+(0.01*stepFreq);
  7. ret=temp;
  8. printf("%d\n",ret);
  9. return ret;
  10. }


 
Le +/- 0.5 et la fonction floor ne marchant pas, j'ai triché comme un goret :-\
 
Maintenant ça marche mais le "+0.01" fait un peu bizarre au milieu du programme.
 
Merci à tous

Reply

Marsh Posté le 05-05-2004 à 18:36:46    

ret=temp+0.5;
 
par exemple.

Reply

Marsh Posté le 05-05-2004 à 18:36:46   

Reply

Marsh Posté le 05-05-2004 à 21:47:55    

+/-0.5 fonctionnent très bien, et c'est ce qui est globalement utilisé, n'en déplaisent aux autres .. ;)


Message édité par cricri_ le 05-05-2004 à 21:48:18
Reply

Marsh Posté le 05-05-2004 à 23:14:01    

putain :
 
#include <math.h>
 
floor/ceil et gcc *.c -o truc.exe -lm
 
il ecrit transpaent Taz ???

Reply

Marsh Posté le 06-05-2004 à 13:37:10    

Cricri_ a écrit :

+/-0.5 fonctionnent très bien, et c'est ce qui est globalement utilisé, n'en déplaisent aux autres .. ;)


 
peut-être, mais chez moi ça ne fonctionnait pas :non:  

Reply

Marsh Posté le 06-05-2004 à 13:38:16    

Joel F a écrit :

putain :
 
#include <math.h>
 
floor/ceil et gcc *.c -o truc.exe -lm
 
il ecrit transpaent Taz ???


 
Non, faut juste deviner  :ange:

Reply

Marsh Posté le 06-05-2004 à 13:48:29    

tu peux aussi caster ou te faire une macro...

Reply

Marsh Posté le 06-05-2004 à 13:50:18    

le cast ne changeais rien :\

Reply

Marsh Posté le 06-05-2004 à 14:12:06    

fif_x a écrit :

Non, faut juste deviner  :ange:


taz et moi t'avons donner la solution. Pint barre. je vois pas ou tu tergiverse


Message édité par Joel F le 06-05-2004 à 14:12:15
Reply

Marsh Posté le 07-05-2004 à 17:05:21    

Vos solutions n'ont pas résoluent mon problème mais je vous remercie de m'avoir aider, je vois pas pourquoi tu t'énerves ...
J'ai tres bien compris ce qu'a voulu dire taz par son "-lm", il suffit juste de connaitre un peu le compilateur qu'on utilise ...
 
zeeeeeeeeeeeeeeeeeeen

Reply

Sujets relatifs:

Leave a Replay

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