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

  FORUM HardWare.fr
  Programmation
  C

  double, float, int : resultat inattendu sur un cast

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

double, float, int : resultat inattendu sur un cast

n°964238
jerem38
Posté le 28-01-2005 à 04:15:10  profilanswer
 

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
mood
Publicité
Posté le 28-01-2005 à 04:15:10  profilanswer
 

n°964245
Lam's
Profil: bas.
Posté le 28-01-2005 à 07:44:32  profilanswer
 

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
n°964756
jerem38
Posté le 28-01-2005 à 16:05:27  profilanswer
 

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  :??:

n°964778
++fab
victime du syndrome IH
Posté le 28-01-2005 à 16:22:39  profilanswer
 

floor, ceil, round

n°977573
danus
Posté le 10-02-2005 à 13:06:51  profilanswer
 

#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

n°978018
DanyJ
Posté le 10-02-2005 à 21:13:04  profilanswer
 

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


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

  double, float, int : resultat inattendu sur un cast

 

Sujets relatifs
random doubleEndianness issue : warning sur cast de pointeur ?
récupération d'un résultat d'une commande sous VBSGarder le résultat d'une requete en mémoire avec PHP
[batch] - récupération du résultat d'une commande et traitementselect d'une resultat isssus d'une procedure sql
comment stocker les résultat dans une variable[PHP][SQL]Double insertion et récuperation de champ
Connaître la plus grande valeur d'un float ? [Résolu][C] Convertion double -> dec -> hex
Plus de sujets relatifs à : double, float, int : resultat inattendu sur un cast


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