double, float, int : resultat inattendu sur un cast - C - Programmation
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 :
|
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 :
|
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
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
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
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 :
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