Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2764 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Calcul avec float

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Calcul avec float

n°1311501
JimmyW
Posté le 22-02-2006 à 14:42:19  profilanswer
 

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

mood
Publicité
Posté le 22-02-2006 à 14:42:19  profilanswer
 

n°1311507
chrisbk
-
Posté le 22-02-2006 à 14:44:07  profilanswer
 

tu fais des divisions entieres

n°1311519
LePhasme
Les Belges domineront le monde
Posté le 22-02-2006 à 14:53:47  profilanswer
 

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.

n°1311522
JimmyW
Posté le 22-02-2006 à 14:56:18  profilanswer
 

Merci infiniment
en passant tout en float ca marche
 
bye

n°1311565
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-02-2006 à 15:37:45  profilanswer
 

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/
n°1311621
Taz
bisounours-codeur
Posté le 22-02-2006 à 16:24:50  profilanswer
 

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

n°1311718
JimmyW
Posté le 22-02-2006 à 17:56:19  profilanswer
 

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 ?

n°1311760
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-02-2006 à 19:17:24  profilanswer
 

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/
n°1311908
matafan
Posté le 22-02-2006 à 23:27:33  profilanswer
 

Et puis d'ailleurs %f, dans printf, ca attend un double... Si tu passes un float, ca peut afficher n'importe quoi.

n°1311911
skelter
Posté le 22-02-2006 à 23:32:58  profilanswer
 

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

mood
Publicité
Posté le 22-02-2006 à 23:32:58  profilanswer
 

n°1311934
Emmanuel D​elahaye
C is a sharp tool
Posté le 23-02-2006 à 00:36:25  profilanswer
 

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/
n°1312144
db__
spécialiste de l'à peu près
Posté le 23-02-2006 à 13:24:56  profilanswer
 

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.

n°1312180
Emmanuel D​elahaye
C is a sharp tool
Posté le 23-02-2006 à 13:46:03  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Calcul avec float

 

Sujets relatifs
Calcul de somme par plages . . .[javascript] calcul de la hauteur d'un élément
[java] lire un feuille de calcul excel au format xml ?CSS - les blocs float:left acceptent mal les padding et margin
CSS - float: right; & position: fixed; ???formatage de float
[resolu]Ma fonction de calcul des fps est-elle bonne ?calcul de nombre
convertir integer en floatroblème de positionnement de news, d'images avec float
Plus de sujets relatifs à : Calcul avec float


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR