double, float, int : resultat inattendu sur un cast

double, float, int : resultat inattendu sur un cast - C - Programmation

Marsh Posté le 28-01-2005 à 04:15:10    

Bonjour,
 
j'ai un comportement étrange d'un cast dans un programme C++.
J'ai fais un petit programme de test en C pour essayer de comprendre :
 

Code :
  1. #include <stdio.h>
  2. int main () {
  3. double i = 1.2 ;
  4. printf("float value : %f\n",i*10);
  5. printf("int value : %i\n",(int)(i*10));
  6. return 0 ;
  7. }


 
le programme compilé avec gcc me donne :

float value : 12.000000
int value : 11


 
si je declare i comme float j'obtiens :

float value : 12.000000
int value : 12


 
Comme cela se fait-il ?
 
J'ai lu le topic ci dessous, mais je sais pas trop si il y a un rapport.
 
http://forum.hardware.fr/forum2.ph [...] subcat=386


Message édité par jerem38 le 28-01-2005 à 04:15:42
Reply

Marsh Posté le 28-01-2005 à 04:15:10   

Reply

Marsh Posté le 28-01-2005 à 07:44:32    

C'est parce que printf arrondit les flottants à l'affichage, alors que le cast en int tronque.  
 
Or, la machine représente interalement les flottants via une somme de puissance de 2. Comme 1,2 ne peut pas être véritablement représenté de façon interne via des puissance de 2 (ça vaut 1,1999999999999999X), tu obtiens ce résultat.
 
Un exemple:

Code :
  1. #include <stdio.h>
  2. int main () {
  3. double valDouble = 1.2 ;
  4. printf("double valeur : %f\n",valDouble*10);
  5. int valCastee = valDouble*10;
  6. printf("int value : %d\n\n",valCastee);
  7. double valDifference = valDouble*100-120;
  8. printf("difference au pif: %1.20f\n\n",valDifference);
  9. double valPrecision = 5.16;
  10. printf("test d'arrondi de 5,16 : %1.1f\n",valPrecision);
  11. printf("test de de troncature de 5,16 : %d\n",(int)valPrecision);
  12. return 0 ;
  13. }


Message édité par Lam's le 28-01-2005 à 07:45:15
Reply

Marsh Posté le 28-01-2005 à 16:05:27    

ok, merci de cette precision.
 
Dans mon programme C++ originel, j'utilise dans une boucle :
 

Code :
  1. (int)(i*10))%5


 
et le modulo me retourne 2 si i = 2.2 ou 2.3.
 
Comment je pourrais faire pour contourner ce probleme ?
je pensais arrondir i*10 a l'entier le plus proche au lieu de le caster
Y a pas de fonction d'arrondie dans la lib math.h  :??:

Reply

Marsh Posté le 28-01-2005 à 16:22:39    

floor, ceil, round

Reply

Marsh Posté le 10-02-2005 à 13:06:51    

#include <math.h>
#include <stdio.h>
 
int main () {
 
double i = 2.2 ;
double x=(i*10);
 
printf("int value : %i\n",(int)(x)%5);
 
return 0 ;
}
 
ce prog donne 2 si i=2.2 et 3 si i=2.3 (chez moi en tout cas avec compilateur gcc) alors que j'avais le meme souci que toi avec un (int)(i*10))%5
Je sais c'est bizarre mais ca marche.
 
chez moi les fct ceil et floor n'ont pas fonctionne.
 
bye

Reply

Marsh Posté le 10-02-2005 à 21:13:04    

Pour resoudre tous ces problèmes de cast et modulo il suffti d'ajouter simplement à toutes tes lignes de cast ou modulo un epsilon de un dix moins six et c'est reglé. cela fonctionnement parfaitement dans ma grosse application sous VisualC++ avec des operation davec des doubles des float et des int:
 
Exemple:
#define EPS_M6 1.0E-6
 
double i= 1.2;
(int)(i*10)+EPS_M6)
 
donne
 
12

Reply

Sujets relatifs:

Leave a Replay

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