Fscanf En C , problème tableau float

Résolu/Fermé
Ayn - 5 déc. 2008 à 21:28
 Ayn - 5 déc. 2008 à 23:29
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.....
A voir également:

4 réponses

quendistu Messages postés 509 Date d'inscription lundi 3 novembre 2008 Statut Membre Dernière intervention 4 juin 2009 87
5 déc. 2008 à 21:36
Dans le dernier printf, formater en ne conservant qu'une seule décimale : "%f.1" je crois.
Cordialement,
0
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
5 déc. 2008 à 22:37
Bonsoir,

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
0
bonsoir,

pourrais-tu m'expliquer pourquoi avec un double ça marche.
92.3 c'est un float non ?

double n'est pas pour une plus grande précision dans les décimales lorsqu'il y a en beaucoup ???
0
quendistu Messages postés 509 Date d'inscription lundi 3 novembre 2008 Statut Membre Dernière intervention 4 juin 2009 87
5 déc. 2008 à 23:14
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,
0
Merci. beaucoup
0