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

  FORUM HardWare.fr
  Programmation
  C++

  Gros problème de division et d'arrondi !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gros problème de division et d'arrondi !

n°227336
pc2000
Posté le 12-10-2002 à 19:01:08  profilanswer
 

Voilà j'ai un problème avec un programme que je fais sur une étude statistique (en C++), j'ai remarqué que lors des divisions quelque soit la variable utilisée, j'avais un arrondi à l'unité près  :cry:  
Par ex :
 

Code :
  1. #include <iostream.h>
  2. void main()
  3. {
  4. float test;
  5. test=1/4;
  6. cout<<test;
  7. }


 
 
Là je compile et au lieu d'avoir 0.25, j'ai 0  :cry:  
Je comprends pas pourquoi j'ai ce résultat  :??:  
PS : j'ai utilisé avec des variables type double, long double ...

mood
Publicité
Posté le 12-10-2002 à 19:01:08  profilanswer
 

n°227337
kadreg
profil: Utilisateur
Posté le 12-10-2002 à 19:02:42  profilanswer
 

1 et 4 dont des entier, et la division entre deux entiers retourne forcéments un entier. Fait la convertion AVANT de faire la division.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°227338
pc2000
Posté le 12-10-2002 à 19:03:46  profilanswer
 

kadreg a écrit a écrit :

1 et 4 dont des entier, et la division entre deux entiers retourne forcéments un entier. Fait la convertion AVANT de faire la division.




Merci de ton aide, mais une conversion c'est à dire ?

n°227339
Kristoph
Posté le 12-10-2002 à 19:05:45  profilanswer
 

fait ca :

Code :
  1. test = 1.0/4.0;
  2. test = 1.0/4;
  3. test = 1/4.0;
  4. test = (float)1/(float)4;
  5. test = static_cast<float>(1) / 4;


 
Il doit bien y en avoir l'un d'entre eux qui marche :D

n°227340
kadreg
profil: Utilisateur
Posté le 12-10-2002 à 19:08:32  profilanswer
 

Code :
  1. #include <iostream.h>
  2.   void main()
  3.   {
  4.     float test;
  5.     test=float(1)/float(4);
  6.     cout<<test;
  7.   }

 
 
Ou alors  
 

Code :
  1. #include <iostream.h>
  2.   void main()
  3.   {
  4.     float test;
  5.     test=1.0f/4.0f;
  6.     cout<<test;
  7.   }


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°227341
pc2000
Posté le 12-10-2002 à 19:09:47  profilanswer
 

Oui mais imaginons que l'utilisateur entre une variable 'val' (cin>>val), il faut que je la mette 'val' en float ou il faut que je convertise la variable tapé (des entiers) en relatif  :pt1cable:

n°227342
pc2000
Posté le 12-10-2002 à 19:14:58  profilanswer
 

Merci beaucoup, j'ai mis un float() devant les variables et c'est bon ca marche impeccable  :)  
Merci beaucoup à vous  ;)


Message édité par pc2000 le 12-10-2002 à 19:15:10
n°227376
Carbon_14
Posté le 12-10-2002 à 22:20:02  profilanswer
 

Souvent, quand valeur comme ça, on force les choses en écrivant  
test = 1 / 4.0; (du moins d'après mes tests car ai déja eu ce genre de pb). Le .0 impose la nature "float" du 4.

n°227408
Musaran
Cerveaulté
Posté le 13-10-2002 à 03:52:56  profilanswer
 

1)
Le 0 après le "." est optionnel, "4." est valide.
Le 0 avant le "." est optionnel s'il y a au moins un chiffre derrière, ".5" est valide.
 
2)
Les constantes littérales à virgules sont des doubles.
Suffixer avec "f" pour en faire des float.

Code :
  1. float test1= .6 ; //warnig, perte de précision
  2. float test2= .6f; //ok


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°227452
Kristoph
Posté le 13-10-2002 à 11:35:05  profilanswer
 

Ce code ne me produit aucun message :
 

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4. float f;
  5. f = (double)1.0 / (double)4.0;
  6. cout << "Result : " << f << endl;
  7. return 0;
  8. }


 
avec cette ligne de commande :

Code :
  1. g++ -Wall -pedantic -o test test.cc


 
gcc 2.96 et 3.04 idem


Message édité par Kristoph le 13-10-2002 à 11:39:32
mood
Publicité
Posté le 13-10-2002 à 11:35:05  profilanswer
 

n°227780
LeGreg
Posté le 14-10-2002 à 02:15:17  profilanswer
 

ca m'etonnerait qu'il ait compile:
 

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4. float f;
  5. f = 1.0 / 4.0;
  6. std::cout << "Result : " << f << std::endl;
  7. return 0;
  8. }

 
 
LeGreg

n°227781
LeGreg
Posté le 14-10-2002 à 02:17:07  profilanswer
 

sinon on evite d'appeler ses programmes test
sous UNIX :)
arf
 
ou alors on les execute comme ca :
> ./test
 
A+
LeGreg

n°227784
Musaran
Cerveaulté
Posté le 14-10-2002 à 03:24:00  profilanswer
 

Sans doute parce que la perte de précision à lieu à l'exécution.
Dans mon exemple, la perte de précision est sur une constante, et n'a pas de sens.
Faire le calcul avec des types plus grands à un sens: avoir plus de précision intermédiaire.
En C/C++, on considère en général que le programmeur sais ce qu'il fait.
 
Pfff... ces promotions silencieuses sont sources de bogues.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°227880
Kristoph
Posté le 14-10-2002 à 20:20:40  profilanswer
 

Si, je confirme. Ca compile bien sous 2.96. Par contre j'ai besoin des modifs pour gcc 3.0.4. Mais bon c'est pas important.
 
Pour info, le type char et le type float sont des types faibles en C et en C++. Le compilo doit toujours les convertir en le int/double suivant le cas avant de faire n'importe quel calcul. Donc c'est aussi pour ca que la convertion en arrière ne donne pas d'avertissements.

n°227931
Carbon_14
Posté le 14-10-2002 à 23:02:15  profilanswer
 

Musaran a écrit a écrit :

2)
Les constantes littérales à virgules sont des doubles.
Suffixer avec "f" pour en faire des float.

Code :
  1. float test1= .6 ; //warnig, perte de précision
  2. float test2= .6f; //ok






 
Merci pour l'info. Je confusionne 0.4 et 0.4f (mal compris). Dès que j'ai l'occasion, je corrige mes sources dans ce sens.


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

  Gros problème de division et d'arrondi !

 

Sujets relatifs
problème de compilation...Tomcat 4 - Problème de sur-persistance d'une page !
Passer un gros site ASP de Access en SQL, HELP ![VB] Problème de typage
Problème lors de l'upload, il me trouve pas d'attributs snifffProblème de comportement avec onUnload
[PERL] Problème d'allocation de la mémoireGros newbie inside .... lecture de char dans un fichier HELP !!!
[php/Mysql] Problème avec SELECT COUNT(*)[html]calques et gros pâtés
Plus de sujets relatifs à : Gros problème de division et d'arrondi !


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