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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1398593
big_dadi_f​at
Posté le 01-07-2006 à 15:54:35  profilanswer
 

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

mood
Publicité
Posté le 01-07-2006 à 15:54:35  profilanswer
 

n°1398605
Taz
bisounours-codeur
Posté le 01-07-2006 à 16:44:30  profilanswer
 
n°1398646
GrosBocdel
Posté le 01-07-2006 à 21:32:38  profilanswer
 

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?

n°1398647
Sve@r
Posté le 01-07-2006 à 21:37:07  profilanswer
 

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.
n°1398704
jagstang
Pa Capona ಠ_ಠ
Posté le 02-07-2006 à 00:46:12  profilanswer
 

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?  
n°1398761
big_dadi_f​at
Posté le 02-07-2006 à 11:59:33  profilanswer
 

merci les gars, ca marche avec  double  :)  
 
 
merci

n°1398768
Taz
bisounours-codeur
Posté le 02-07-2006 à 12:16:31  profilanswer
 

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

n°1398770
Taz
bisounours-codeur
Posté le 02-07-2006 à 12:20:55  profilanswer
 

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

n°1398782
GrosBocdel
Posté le 02-07-2006 à 13:38:56  profilanswer
 

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.

n°1398786
slash33
Posté le 02-07-2006 à 13:48:06  profilanswer
 

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

mood
Publicité
Posté le 02-07-2006 à 13:48:06  profilanswer
 

n°1398787
big_dadi_f​at
Posté le 02-07-2006 à 13:50:20  profilanswer
 

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

n°1398838
_kal_
Posté le 02-07-2006 à 16:14:05  profilanswer
 

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:

n°1398844
jagstang
Pa Capona ಠ_ಠ
Posté le 02-07-2006 à 16:27:29  profilanswer
 

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?  
n°1398846
_kal_
Posté le 02-07-2006 à 16:32:46  profilanswer
 

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
n°1398851
jagstang
Pa Capona ಠ_ಠ
Posté le 02-07-2006 à 16:49:12  profilanswer
 

_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?  
n°1398875
_kal_
Posté le 02-07-2006 à 18:28:02  profilanswer
 

jagstang a écrit :

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


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

n°1398895
Taz
bisounours-codeur
Posté le 02-07-2006 à 20:08:44  profilanswer
 

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.

n°1398908
GrosBocdel
Posté le 02-07-2006 à 20:39:23  profilanswer
 

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.

n°1398985
Sve@r
Posté le 02-07-2006 à 22:27:56  profilanswer
 

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

n°1399010
Taz
bisounours-codeur
Posté le 02-07-2006 à 22:46:52  profilanswer
 

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

n°1399023
masklinn
í dag viðrar vel til loftárása
Posté le 02-07-2006 à 22:53:39  profilanswer
 

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
n°1399053
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-07-2006 à 23:48:44  profilanswer
 

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)
n°1399057
jagstang
Pa Capona ಠ_ಠ
Posté le 02-07-2006 à 23:53:56  profilanswer
 

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?  
n°1399128
el muchach​o
Comfortably Numb
Posté le 03-07-2006 à 08:18:56  profilanswer
 

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
n°1399214
big_dadi_f​at
Posté le 03-07-2006 à 10:54:18  profilanswer
 

Harkonnen a écrit :

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


 
 :sweat:  
 
 

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
Problème envoie image + redimenssionnement : marche paspetit soft relier a un site internet
Petit programme de débutantPetit problème lors de la récupération de donnée.
aide petit prog cPetit soucis...
aide pour petit script phpmon petit prog en PASCAL marche pas mais je vois pa l'erreur....HELP
petit prog en C qui ne marche pas[openGL] pourquoi mon petit prog marche pas ?
Plus de sujets relatifs à : un petit prog qui marche mais ne marche pas !!!


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