Rechercher : dans
Par :

Fscanf En C , problème tableau float

Dernière réponse le 5 déc 2008 à 23:29:38 Ayn, le 5 déc 2008 à 21:28:19 
 Signaler ce message aux modérateurs

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.....

Configuration: Windows Vista
Firefox 3.0.4

Meilleures réponses pour « Fscanf En C , problème tableau float » dans :
Les variables en C++ VoirLes variables en C++ 1. Les différents types de variables 1.1 bool 1.2 char 1.3 unsigned short int 1.4 short int 1.5 unsigned long int 1.6 long int 1.7 int (16 bits) 1.8 int (32 bits) 1.9 unsigned int (16 bits) 1.10 unsigned int (32...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Introduction à la STL en C++ (standard template library) VoirIntroduction Principales classes de la STL std::pair std::list std::vector std::set std::map Les iterators iterator et const_iterator reverse_iterator et const_reverse_iterator Les algorithmes ...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

quendistu, le 5 déc 2008 à 21:36:33

Dans le dernier printf, formater en ne conservant qu'une seule décimale : "%f.1" je crois.
Cordialement,

Répondre à quendistu

2

cchristian, le 5 déc 2008 à 22:37:25

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
Cordialement.

Cchristian.

Répondre à cchristian

3

Ayn, le 5 déc 2008 à 22:53:11

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

Répondre à Ayn

4

quendistu, le 5 déc 2008 à 23:14:32

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,

Répondre à quendistu

5

 Ayn, le 5 déc 2008 à 23:29:38

Merci. beaucoup

Répondre à Ayn