un petit prog qui marche mais ne marche pas !!!

un petit prog qui marche mais ne marche pas !!! - C - Programmation

Marsh Posté le 01-07-2006 à 15:54:35    

Bonjour  
Voila j'ai fait une calculatrice en C dont voila le code :  
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int main(int argc, char *argv[])
  5. {
  6.     long operation, nombre1, nombre2, resultat, reste;
  7.   printf("=== Operation ===\n\n" );
  8.   printf("1 = Addition\n" );
  9.   printf("2 = Soustraction\n" );
  10.   printf("3 = Mutiplication\n" );
  11.   printf("4 = Division\n" );
  12.   printf("5 = Puissance (Pose plusieurs petits problemes)\n\n" );
  13.  
  14.   printf("Attention ne pas mettre le calcul directement mais seulement\nle numero de l'operation\nexemple: addition = 1, soustraction = 2, ect...\n\n" ); // information
  15.   printf("Votre choix ?" );  //Demande l'opération
  16.   scanf("%ld", &operation);
  17.  
  18.   printf("\nAide: Pour les puissances le 2eme nombre est la puissance!\n" ); //Petite aide
  19.  
  20.   printf("\nVeillez entrer le premier nombre : " );   //Demande le premier nombre
  21.   scanf("%ld", &nombre1);
  22.  
  23.   printf("\nVeillez entrer le deuxieme nombre : " );  //Demande le deuxieme nombre
  24.   scanf("%ld", &nombre2);
  25.  
  26.   printf("\n" );
  27.  
  28.   switch (operation)  // Les operations
  29.   {
  30.          case 1:
  31.               resultat = nombre1 + nombre2;
  32.               printf("%ld + %ld = %ld\n", nombre1, nombre2, resultat);
  33.               printf("Resultat de l'addition est %ld\n", resultat);
  34.               break;
  35.          case 2:
  36.               resultat = nombre1 - nombre2;
  37.               printf("%ld - %ld = %ld\n", nombre1, nombre2, resultat);
  38.               printf("Resultat de la soustraction est %ld\n", resultat);
  39.               break;
  40.          case 3:
  41.               resultat = nombre1 * nombre2;
  42.               printf("%ld * %ld = %ld\n", nombre1, nombre2, resultat);
  43.               printf("Resultat de la multiplication est %ld\n", resultat);
  44.               break;
  45.          case 4:
  46.               resultat = nombre1 / nombre2;
  47.               reste = nombre1 % nombre2;
  48.               printf("%ld / %ld = %ld \nreste(s) = %ld\n\n", nombre1, nombre2, resultat, reste);
  49.               printf("Resultat de la division est %ld, reste(s) : %ld\n", resultat, reste);
  50.               break;
  51.          case 5:
  52.               resultat = pow(nombre1, nombre2);
  53.               printf("%ld puissance %ld = %ld\n", nombre1, nombre2, resultat);
  54.               printf("Resultat de la puissance est %ld\n", resultat);
  55.               break;
  56.          default: //le numero de l'operation ne convient pas
  57.               printf("Numero de l'operation invalide !\n" );
  58.               break;
  59.               }
  60.   printf("\n" );
  61.   system("PAUSE" );     
  62.   return 0;
  63. }


 
Le probleme est que quand je fais les puissances certaine donne un résultat faux comme 5 puissance 2 qui donne 24 au lieu de 25.  
pourtant c'est un programme tés facil et je ne vois pas l'erreur !
 
merci

Reply

Marsh Posté le 01-07-2006 à 15:54:35   

Reply

Marsh Posté le 01-07-2006 à 16:44:30    

Reply

Marsh Posté le 01-07-2006 à 21:32:38    

De tête et excusez moi si je dis une bêtise, je ne suis pas sûr que la fonction pow ait un prototype avec des types 'long'.
Si tu prends des double au lieu de prendre des long, tu as la même erreur?

Reply

Marsh Posté le 01-07-2006 à 21:37:07    

GrosBocdel a écrit :

De tête et excusez moi si je dis une bêtise, je ne suis pas sûr que la fonction pow ait un prototype avec des types 'long'.
Si tu prends des double au lieu de prendre des long, tu as la même erreur?


Non, t'as tout à fait raison. "pow" (comme toutes les fonctions de la librairie "libm" ) travaille avec des doubles et renvoie un double (et il faut éviter d'élever un nombre négatif à une puissance "x/y" avec y pair et non diviseur de "x" car cela mène à un nombre complexe)


Message édité par Sve@r le 01-07-2006 à 21:38:20

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-07-2006 à 00:46:12    

j'en avais fait une basique avec des pointeur de fonctions
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. int plus(int a, int b) { return a+b ; }
  5. int moins(int a, int b) { return a-b ; }
  6. int fois(int a, int b) { return a*b ; }
  7. int quot(int a, int b) { return a/b ; }
  8. int mod(int a, int b) { return a%b ; }
  9. int power(int a, int b) { return pow(a,b) ; }
  10. int ((*fct[])(int, int)) = {plus, moins, fois, quot, mod, power } ;
  11. char op[] = "+-*/%^" ;
  12. int main(int argc, char *argv[])
  13. {
  14.   int a, b, res ;
  15.   char c, *p_op ;
  16.  
  17.   while (1)
  18.   {
  19.     printf("<< : " ) ;
  20.     if (scanf("%d%c%d",&a,&c,&b) <= 0)
  21.         break ;
  22.        
  23.     if ((p_op=strchr(op,c)) == NULL)
  24.     {
  25.       printf("operateur inconnu : %c", c) ;
  26.       continue ;
  27.     }
  28.    
  29.     res = (*fct[p_op-op])(a,b) ;
  30.     printf(">> : %d\n", res) ;
  31.   }
  32.   system("PAUSE" );
  33.   return 0;
  34. }


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 02-07-2006 à 11:59:33    

merci les gars, ca marche avec  double  :)  
 
 
merci

Reply

Marsh Posté le 02-07-2006 à 12:16:31    

ça fait plaisir de voir que tu as lu le dit PDF. Pas la peine de revenir quand tu trouveras une autre combinaison qui te donne un résultat faux avec double.

Reply

Marsh Posté le 02-07-2006 à 12:20:55    

le pire finalement c'est perl où mêmes les int sont représentés par des double ... c'est très drôle.

Reply

Marsh Posté le 02-07-2006 à 13:38:56    

Mais non mais il faut quand même que la réponse soit adaptée à la question, Taz, quand même.
Le pdf dont tu as donné l'adresse, personnellement il y a des chances que je le lise. Mais donner à lire un document de 40 pages où un gars se bat avec des epsilon alors que tu vois bien que big_dadi_fat doit en être à ses première lignes de C, admets que c'est inadapté !
Mais quand on est confronté à des erreurs d'arrondi de meeeeeeeeeeeeeeeeerde, ce document est bien, oui.

Reply

Marsh Posté le 02-07-2006 à 13:48:06    

Le document est la spec IEEE. Plutôt indigeste mais apportant des informations nécessaires.

Reply

Marsh Posté le 02-07-2006 à 13:48:06   

Reply

Marsh Posté le 02-07-2006 à 13:50:20    

GrosBocdel a écrit :

Mais non mais il faut quand même que la réponse soit adaptée à la question, Taz, quand même.
Le pdf dont tu as donné l'adresse, personnellement il y a des chances que je le lise. Mais donner à lire un document de 40 pages où un gars se bat avec des epsilon alors que tu vois bien que big_dadi_fat doit en être à ses première lignes de C, admets que c'est inadapté !
Mais quand on est confronté à des erreurs d'arrondi de meeeeeeeeeeeeeeeeerde, ce document est bien, oui.


 
ce document et bien , je suis entrain de le lire.
mais bon cértain chose m'aichape

Reply

Marsh Posté le 02-07-2006 à 16:14:05    

En plus il est en anglais ce pdf, déjà que les maths en français c'est pas simple, alors en anglais : a+ :lol:

Reply

Marsh Posté le 02-07-2006 à 16:27:29    

si t'es bon ni en englais, ni en math, t'es bon en quoi? :D


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 02-07-2006 à 16:32:46    

jagstang a écrit :

si t'es bon ni en englais, ni en math, t'es bon en quoi? :D


 
En tout cas, toi t'es pas bon en français :D
 
J'ai pas dit que j'étais mauvais en maths et en anglais, juste que les maths c'était pas simple et encore moins en anglais. Nan vraiment, le français c'est pas ton truc  :whistle:

Message cité 1 fois
Message édité par _kal_ le 02-07-2006 à 16:34:07
Reply

Marsh Posté le 02-07-2006 à 16:49:12    

_kal_ a écrit :

En tout cas, toi t'es pas bon en français :D
 
J'ai pas dit que j'étais mauvais en maths et en anglais, juste que les maths c'était pas simple et encore moins en anglais. Nan vraiment, le français c'est pas ton truc  :whistle:


 
l'église qui si fout de la charité... Allez a+ petit


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 02-07-2006 à 18:28:02    

jagstang a écrit :

l'église qui si fout de la charité... Allez a+ petit


 
Oui, oui, oui ...  [:*pikachu*]

Reply

Marsh Posté le 02-07-2006 à 20:08:44    

GrosBocdel a écrit :

Mais non mais il faut quand même que la réponse soit adaptée à la question, Taz, quand même.
Le pdf dont tu as donné l'adresse, personnellement il y a des chances que je le lise. Mais donner à lire un document de 40 pages où un gars se bat avec des epsilon alors que tu vois bien que big_dadi_fat doit en être à ses première lignes de C, admets que c'est inadapté !
Mais quand on est confronté à des erreurs d'arrondi de meeeeeeeeeeeeeeeeerde, ce document est bien, oui.


tu le lis une fois et après tu ne te poses plus de question. Il n'y pas d'erreur d'arrondi. Au final tu vois bien que la réponse au problème c'est 'passe en double' et c'est ça l'erreur.

Reply

Marsh Posté le 02-07-2006 à 20:39:23    

Je vais le lire, faut juste me laisser le temps. C'est vrai que la problématique est intéressante. J'ai déjà été confronté à ce genre de choses pour mon boulot, avec des inversions de matrices creuses où fortran et C partaient dans le décors. La solution temporaire était de passer sous matlab qui s'en sortait bien.
On m'avait dit de me tourner vers les routines de calcul en précision arbitraire, il va aussi falloir que je m'y colle.

Reply

Marsh Posté le 02-07-2006 à 22:27:56    

Taz a écrit :

tu le lis une fois et après tu ne te poses plus de question. Il n'y pas d'erreur d'arrondi. Au final tu vois bien que la réponse au problème c'est 'passe en double' et c'est ça l'erreur.


Tu peux pas nier que la fonction "pow()" veut impérativement des doubles. Donc la solution est soit:
1) de travailler entièrement avec des doubles (ce qui, soit dit en passant, apporte aussi une amélioration dans la division)
2) de faire un cast lors de l'appel à pow()
3) de s'implémenter son petit "pow" perso qui travaille avec des int

Reply

Marsh Posté le 02-07-2006 à 22:46:52    

mais je ne le nis absolument pas. seulement la solution 3 me semble de moins la plus correcte si.

Reply

Marsh Posté le 02-07-2006 à 22:53:39    

slash33 a écrit :

Le document est la spec IEEE.


Euuh absolument pas non [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 02-07-2006 à 23:48:44    

Taz en premiere réponse ! le pauvre dadi_fat, il a vraiment pas de pow

Message cité 2 fois
Message édité par Harkonnen le 02-07-2006 à 23:50:23

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-07-2006 à 23:53:56    

Harkonnen a écrit :

Taz en premiere réponse ! le pauvre dadi_fat, il a vraiment pas de pow


 :lol:  :lol:  :lol:


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 03-07-2006 à 08:18:56    

GrosBocdel a écrit :

Je vais le lire, faut juste me laisser le temps. C'est vrai que la problématique est intéressante. J'ai déjà été confronté à ce genre de choses pour mon boulot, avec des inversions de matrices creuses où fortran et C partaient dans le décors. La solution temporaire était de passer sous matlab qui s'en sortait bien.
On m'avait dit de me tourner vers les routines de calcul en précision arbitraire, il va aussi falloir que je m'y colle.


Pas forcément, il faut utiliser les bonnes librairies de calcul (celles qui sont utilisées par Matlab).


Message édité par el muchacho le 03-07-2006 à 08:20:34

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 03-07-2006 à 10:54:18    

Harkonnen a écrit :

Taz en premiere réponse ! le pauvre dadi_fat, il a vraiment pas de pow


 
 :sweat:  
 
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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