Gros problème de division et d'arrondi !

Gros problème de division et d'arrondi ! - C++ - Programmation

Marsh Posté le 12-10-2002 à 19:01:08    

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

Reply

Marsh Posté le 12-10-2002 à 19:01:08   

Reply

Marsh Posté le 12-10-2002 à 19:02:42    

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 !
Reply

Marsh Posté le 12-10-2002 à 19:03:46    

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 ?

Reply

Marsh Posté le 12-10-2002 à 19:05:45    

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

Reply

Marsh Posté le 12-10-2002 à 19:08:32    

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 !
Reply

Marsh Posté le 12-10-2002 à 19:09:47    

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:

Reply

Marsh Posté le 12-10-2002 à 19:14:58    

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
Reply

Marsh Posté le 12-10-2002 à 22:20:02    

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.

Reply

Marsh Posté le 13-10-2002 à 03:52:56    

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
Reply

Marsh Posté le 13-10-2002 à 11:35:05    

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
Reply

Marsh Posté le 13-10-2002 à 11:35:05   

Reply

Marsh Posté le 14-10-2002 à 02:15:17    

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

Reply

Marsh Posté le 14-10-2002 à 02:17:07    

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

Reply

Marsh Posté le 14-10-2002 à 03:24:00    

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
Reply

Marsh Posté le 14-10-2002 à 20:20:40    

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.

Reply

Marsh Posté le 14-10-2002 à 23:02:15    

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.

Reply

Sujets relatifs:

Leave a Replay

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