Calcul avec float - C - Programmation
Marsh Posté le 22-02-2006 à 14:53:47
Code :
|
1 est un entier.
3 est un entier
=> division entre entier => si il y a une partie décimale à la réponse celle-ci est "oubliée" et le restant est converti en flottant.
En mettant 1./3 ca devrait fonctionner.
Marsh Posté le 22-02-2006 à 14:56:18
ReplyMarsh Posté le 22-02-2006 à 15:37:45
JimmyW a écrit : en passant tout en float ca marche |
float c'est pour optimiser le stockage. Pour faire des calculs sérieux, on utilise double...
Marsh Posté le 22-02-2006 à 16:24:50
hum pas vraiment d'accord. J'ai eu a traité de grosses quantités de données (imagerie). En codant bien (toutes les opérations en float, pas de passage incessant float<->double), j'ai obtenu un gain de performance non-négligeable. Ce n'est peut-être pas le calcul en float qui est plus rapide, mais je pense que l'accélération n'est pas étrangère à une meilleure utilisation du cache (parce que données plus petites).
Marsh Posté le 22-02-2006 à 17:56:19
Le code modifié ainsi fonctionne :
int main()
{
int x=1,y=3;
float a;
a =1./3.;
printf("1) a=%f \n",a);
a =(float)(x)/(float)(y);
printf("2) a=%f \n",a);
a =.3333;
printf("3) a=%f \n",a);
return 0;
}
Est-ce la seule méthode (sachant que x et y sont int) ?
Est-ce la plus rapide ?
Marsh Posté le 22-02-2006 à 19:17:24
JimmyW a écrit : Le code modifié ainsi fonctionne :
|
Balises code please...
|
Je t'ai déjà dit qu'il fallait faire les calculs en double. Dans ton code, il y a 40.000 conversions float/double, c'est horrible et inefficace.
|
Marsh Posté le 22-02-2006 à 23:27:33
Et puis d'ailleurs %f, dans printf, ca attend un double... Si tu passes un float, ca peut afficher n'importe quoi.
Marsh Posté le 22-02-2006 à 23:32:58
matafan a écrit : Et puis d'ailleurs %f, dans printf, ca attend un double... Si tu passes un float, ca peut afficher n'importe quoi. |
non, double ou float, sous entendu un float sera promu en double
Marsh Posté le 23-02-2006 à 00:36:25
matafan a écrit : Et puis d'ailleurs %f, dans printf, ca attend un double... Si tu passes un float, ca peut afficher n'importe quoi. |
C'est pareil (voir "promotion" ). Par contre avec *scanf(), ça chie !
Marsh Posté le 23-02-2006 à 13:24:56
Citation : Je t'ai déjà dit qu'il fallait faire les calculs en double. Dans ton code, il y a 40.000 conversions float/double, c'est horrible et inefficace. |
lorsqu'on compile avec gcc 3.2.2 en faisant une sortie assembleur, dans la version avec float il y a un empilage dépilage dans la pile des flottants pour faire une conversion float double à chaque fois que nécessaire. Il vaut donc mieux utiliser des doubles.
Dans le cas d'utilisation du mmx le float est peut être plus rapide
Sinon l'optimisation du cache est moins couteux que de faire un empilage dépilage à chaque fois.
De toute façon dans l'unité de calcul flottant du .387 les calculs se font sur 80 bits et il y a des transformations après pour ajuster le résultat au 64 ou 32 bits suivant la sortie demandée.
En bref on gagne pas grand chose en temps de calcul avec du float ou du double
par contre on gagne en place en float ce qui vaut le coup si on n'a beaucoup de données à manipuler.
Marsh Posté le 23-02-2006 à 13:46:03
db__ a écrit : De toute façon dans l'unité de calcul flottant du .387 les calculs se font sur 80 bits et il y a des transformations après pour ajuster le résultat au 64 ou 32 bits suivant la sortie demandée. |
Le i86 n'est qu'une machine parmi d'autres... Je travaille en PowerPC...
Citation : par contre on gagne en place en float ce qui vaut le coup si on n'a beaucoup de données à manipuler. |
-ed-
Citation : float c'est pour optimiser le stockage |
Marsh Posté le 22-02-2006 à 14:42:19
Bonjour,
voici mon code
int main()
{
int x=1,y=3;
float a;
a =1/3;
printf("1) a=%f \n",a);
a =x/y;
printf("2) a=%f \n",a);
a =.3333;
printf("3) a=%f \n",a);
return 0;
}
je le compile avec
gcc 1.c -o 1
j'exécute, ce qui donne
1) a=0.000000
2) a=0.000000
3) a=0.333300
comment expliquer 1 et 2 ?
merci