Fscanf En C , problème tableau float
Résolu
Ayn
-
Ayn -
Ayn -
Bonjour,
j'ai un problème avec mon fscanf en C.
j'ai un tableau de int et un tableau de notes
je lis un fichier contenant un numéro(int) suivit d,un nombre(float)
et jeux stocker ça dans mes deux tableaux séparément.
Le problème c'est que quand j'affiche mon tableau de float il change les décimales d'un nombre
ex: au lieu de 78.7 il affiche 78.699997 , au lieu de 92.3 il affiche 92.300003
Je ne comprend pas qu'il change les float étant donné que je ne fais aucun calcul avec ces nombres.
S.V.P aider moi si vous connaissez la source du problème
Merci
Voici les lignes:
int tab1[MAX];
float tab2[MAX];
int nbr = 0;
int i;
char* notes = "notes.txt";
FILE* fich = fopen(notes,"r");
while ( !feof (fich) )
{
fscanf(fich, "%d%f" , &tab1[nbr], &tab2[nbr]);
nbr++;
}
fclose(fich);
for (i=0 ; i<nbr ; i++)
printf("%f ", tab2[i] );
le fichier notes.txt contient:
1000 65.5
1001 23.4
1002 78.7
1003 98.6
1004 67.7
1005 76.8
1006 99.9
1007 100.0
1008 65.2
1009 87.4
1010 98.3
1011 92.3
1012 43.2
1013 84.2
1014 12.3
1015 65.6
1016 23.5
1017 78.8
1018 98.7
etc.....
j'ai un problème avec mon fscanf en C.
j'ai un tableau de int et un tableau de notes
je lis un fichier contenant un numéro(int) suivit d,un nombre(float)
et jeux stocker ça dans mes deux tableaux séparément.
Le problème c'est que quand j'affiche mon tableau de float il change les décimales d'un nombre
ex: au lieu de 78.7 il affiche 78.699997 , au lieu de 92.3 il affiche 92.300003
Je ne comprend pas qu'il change les float étant donné que je ne fais aucun calcul avec ces nombres.
S.V.P aider moi si vous connaissez la source du problème
Merci
Voici les lignes:
int tab1[MAX];
float tab2[MAX];
int nbr = 0;
int i;
char* notes = "notes.txt";
FILE* fich = fopen(notes,"r");
while ( !feof (fich) )
{
fscanf(fich, "%d%f" , &tab1[nbr], &tab2[nbr]);
nbr++;
}
fclose(fich);
for (i=0 ; i<nbr ; i++)
printf("%f ", tab2[i] );
le fichier notes.txt contient:
1000 65.5
1001 23.4
1002 78.7
1003 98.6
1004 67.7
1005 76.8
1006 99.9
1007 100.0
1008 65.2
1009 87.4
1010 98.3
1011 92.3
1012 43.2
1013 84.2
1014 12.3
1015 65.6
1016 23.5
1017 78.8
1018 98.7
etc.....
A voir également:
- Fscanf En C , problème tableau float
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Imprimer tableau excel sur une page - Guide
4 réponses
Dans le dernier printf, formater en ne conservant qu'une seule décimale : "%f.1" je crois.
Cordialement,
Cordialement,
Bonsoir,
En espérant que ces quelques tests répondent à ton interrogation et sont exhaustifs relativement au problème posé :
Résultats :
En espérant que ces quelques tests répondent à ton interrogation et sont exhaustifs relativement au problème posé :
float un = 78.7; double deux = 78.7; long double trois = 78.7; float un1 = 92.3; double deux2 = 92.3; long double trois3 = 92.3;
printf ("\n\n"); printf ("\n\n"); printf ("\n float un f = %f", un); printf ("\n double deux f = %f", deux); printf ("\n double e deux = %e", deux); printf ("\n long double trois f = %f", trois); printf ("\n long double trois e = %e", trois); printf ("\n\n"); printf ("\n float un1 f = %f", un1); printf ("\n double deux2 f = %f", deux2); printf ("\n double e deux2 = %e", deux2); printf ("\n long double trois3 f = %f", trois3); printf ("\n long double trois3 e = %e", trois3);
Résultats :
float un f = 78.699997 double deux f = 78.700000 double deux e = 7.870000e+001 long double trois f = 78.700000 long double trois e = 7.870000e+001 float un1 f = 92.300003 double deux2 f = 92.300000 double deux2 e = 9.230000e+001 long double trois3 f = 92.300000 long double trois3 e = 9.230000e+001
Un double c'est un double float ; le nombre réel est représenté sur plus de bits donc il est plus précis.
Fais un printf("%d %d", sizeof(float), sizeof(double)), tu verras.
Le nombre 92,3 ne tient pas sur un float : aucune combinaison des différents bits d'un float ne correspond à cette valeur. Il est donc "arrondi", par la représentation interne d'un float, à 92,300003.
En revanche il existe une combinaison de bits d'un double qui correspond exactement à 92,3.
Cordialement,
Fais un printf("%d %d", sizeof(float), sizeof(double)), tu verras.
Le nombre 92,3 ne tient pas sur un float : aucune combinaison des différents bits d'un float ne correspond à cette valeur. Il est donc "arrondi", par la représentation interne d'un float, à 92,300003.
En revanche il existe une combinaison de bits d'un double qui correspond exactement à 92,3.
Cordialement,