Calcul avec float

Calcul avec float - C - Programmation

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

Reply

Marsh Posté le 22-02-2006 à 14:42:19   

Reply

Marsh Posté le 22-02-2006 à 14:44:07    

tu fais des divisions entieres

Reply

Marsh Posté le 22-02-2006 à 14:53:47    

Code :
  1. a = 1/3


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.

Reply

Marsh Posté le 22-02-2006 à 14:56:18    

Merci infiniment
en passant tout en float ca marche
 
bye

Reply

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


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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

Reply

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 ?

Reply

Marsh Posté le 22-02-2006 à 19:17:24    

JimmyW a écrit :

Le code modifié ainsi fonctionne :

Code :
  1. int main()
  2. {
  3.  
  4.     int x=1,y=3;
  5.     float a;
  6.         
  7.     a =1./3.;
  8.     printf("1) a=%f \n",a);
  9.     a =(float)(x)/(float)(y);
  10.     printf("2) a=%f \n",a);
  11.     a =.3333;
  12.     printf("3) a=%f \n",a);
  13.  
  14.     return 0;
  15. }


Est-ce la seule méthode (sachant que x et y sont int) ?  
Est-ce la plus rapide ?


 
Balises code please...


main.c: In function `main_':
main.c:13: error: implicit declaration of function `printf'
main.c:13: warning: nested extern declaration of `printf'
<internal>:0: warning: redundant redeclaration of 'printf'
main.c:20:2: warning: no newline at end of file


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.


#include <stdio.h>
 
int main (void)
{
   int x = 1, y = 3;
   double a;
 
   a = 1. / 3;
   printf("1) a=%f \n", a);
 
   a = x / (double)y;
   printf("2) a=%f \n", a);
 
   a = .333333;
   printf("3) a=%f \n", a);
 
   return 0;
}


Message édité par Emmanuel Delahaye le 22-02-2006 à 19:22:11

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.

Reply

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

Reply

Marsh Posté le 22-02-2006 à 23:32:58   

Reply

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 !


Message édité par Emmanuel Delahaye le 23-02-2006 à 00:36:41

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.

Reply

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.
 
En bref on gagne pas grand chose en temps de calcul avec du float ou du double


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


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed