[C] Résultat bizarre avec les puissances

Voir le sujet précédent Voir le sujet suivant Aller en bas

[C] Résultat bizarre avec les puissances

Message  Bill le Mar 21 Sep 2010, 21:17

Bonsoir,

Voila, je suis sur l'exercice du palindrome, et je me suis dis qu'avec les puissances, cela pourrait sacrement m'aider, mais voila, à certains moment, quand je regarde les valerus qui se trouvent dans mes variable, je me retrouve avec des valeurs comme 9999 quand j'ai pow(10,i) /*i valant 4 a ce moment la du code (c'est un exemple, y a des moment, j'ai le bon résultat à d'autre moment je me retrouve avec le résultat -1.

Code:

BOOL estPalindrome (UINT nb){
   BOOL b = FAUX;
   int j= nbDigits(nb)-1;
   int i = 1;
   int n1, n2, n3, n31, n32, a,c;
   n2 = 10;
   while (i<= nbDigits (nb)){
      n1 = nb / pow (10,j);
      n31 = (pow(10, (i)));
      n32 = pow (10,i-1);
      n3 = n31/ n32;
      a = n1 % n2;
      c = nb % n3;

      if (a == c){
         b = VRAI;
      }else {
         b = FAUX;
         i = j ;
      }
      i++;
      j--;
   }
   return b;
}

Je ne sais pas si ma logique est bonne et à la limite c'est pas trop mon problème principal, c'est surtout le fait que cela fausse le reste des calculs qui suivent...est-ce normal?
Merci.

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  karemkadidola le Mar 21 Sep 2010, 21:28

je ne me suis pas trop penché sur ta logique...mais je voulais juste te rassurer (pour avoir connu un problème similaire avec le jeu de la fourchette) que la console d'éclipse qui gère l'affichage à l'écran donne parfois l'impression de ne pas respecter l'exécution du programme (BUG) et la seule façon de voir que mon programme marchait bien était d'exécuter le .exe du projet qui lui même lance une console dos et là miracle tout se passe bien...essaye toujours ça..je ne sais pas si ton problème se trouve à ce niveau là! bonne chance
sinon dis moi que fait la methode "nbDigits" ?

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  mcd le Mar 21 Sep 2010, 21:59

Vérifie un peu la signature de la méthode 'pow'. Que reçoit-elle ? Que retourne-t-elle ?

mcd

Nombre de messages : 1548
Prénom : Marco
Statut : prof
Localisation : Molenbeek
Date d'inscription : 29/09/2006

http://mcd.namok.be

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  Bill le Mar 21 Sep 2010, 22:02

La méthode nbDigits retourne le nombre de chiffre que le nombre a.
Que Voulez-vous dire par signature de la méthode pow ?
(Je viens de tester ma logique en java, c'est pas bon, donc faut pas trop regarder ca ^^)

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  mcd le Mar 21 Sep 2010, 22:37

Je voulais dire que j'y connais trop rien en C mais une petite recherche google m'indique que 'pow' retourne un 'double' et pas un 'int'.
Or, toutes tes variables sont des 'int'.
Je ne sais plus comment C se comporte dans ces cas-là mais il faut certainement se poser la question de la conversion.

mcd

Nombre de messages : 1548
Prénom : Marco
Statut : prof
Localisation : Molenbeek
Date d'inscription : 29/09/2006

http://mcd.namok.be

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  Bill le Mar 21 Sep 2010, 22:52

Voila, j'ai réussi la méthode, avec une toute autre logique (grâce à un collègue, je dois l'avouer) j'ai aussi utilisé un pow dedans avec des int, ca n'a pas bronché.
Est-ce possible que le compilateur C fasse une conversion implicite de int en double et qu'il y a une perte de précision ?

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  smb le Mar 21 Sep 2010, 23:08

Je ne veux pas m'immiscer dans vos conversations, mais je vous invite à ne pas utiliser pour l'instant les fonctions mathématiques (celles dont le prototype est dans math.h), d'autant plus que ce n'est pas le but des premiers exercices du TD 1.
Vous voulez une fonction pow qui ne manipule que des entiers non signés ? Codez-la vous même en respectant, par exemple, ce prototype:
Code:

typedef unsigned int UINT ;
UINT powUINT ( UINT valeur , UINT puissance ) ; 
/*
  fonction évaluant :  valeur ** puissance
  attention si overflow
  utiliser UINT_MAX de limits.h peut s'avérer intéressant
*/
En C les réels sont des pseudo-réels ! Il y a parfois des pertes de précisions ...

... fichtre !


smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  smb le Mer 22 Sep 2010, 10:27

Par curiosité, testez un peu le code suivant :

Code:

/*
 * Conversion double en UINT et problème de précision
 */
#include <math.h>
#include <stdio.h>
typedef unsigned int UINT ;
int main() {
   {
   UINT exp , val , valc, valf ;
   printf("  %17s %17s %17s\n","pow(10,i)","ceil(pow(10,i))","floor(pow(10,i))");
   for ( exp=1 ; exp<10; ++exp ) {
      val = pow(10,exp);
      valc = ceil(pow(10,exp));
      valf = floor(pow(10,exp));
      printf("%2i %17u %17u %17u\n",exp,val,valc,valf);
   }
   }

   {
      UINT vu1,vu2 ;
      double d1= 9.999999999999999  ;
      double d2= 9.9999999999999999 ;
      printf("\n--------------------------------------------------------\n");
      vu1 = d1 ;
      printf("9.999999999999999  donnera %2u (en UINT)\n",vu1);
      vu2 = d2 ;
      printf("9.9999999999999999 donnera %2u (en UINT)\n",vu2);
   }
return 0;
}

Surprised

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  Wark le Mer 22 Sep 2010, 19:13

Bill a écrit:La méthode nbDigits retourne le nombre de chiffre que le nombre a.
Que Voulez-vous dire par signature de la méthode pow ?
(Je viens de tester ma logique en java, c'est pas bon, donc faut pas trop regarder ca ^^)

Moi, je stockerais le résultat de nbDigits dans une variable plutôt que de l'appeler pleins de fois (à chaque itération) ... enfin, l'optimisation n'est pas le premier souhait de chacun. Razz

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  LSV le Mer 22 Sep 2010, 22:09

Sinon, la logique me parait un peu bizarre...

personnelement, je fais un truc du genre

chiffreaTester = chiffreEnParamètre
tant que(chiffreaTester != 0) faire
chiffreInversé = chiffreInversé*10 + chiffreaTester % 10
chiffreaTester / 10
FTQ

si (chiffreEnParamètre = chiffreInversé) alors
est palindrome
Fin si


imaginons que tu veux tester 151
premiere itération => chiffre inversé = 1 (reste de 151/10), chiffreaTester = 15
deuxieme itération => chiffre inversé = 1*10 + 5 (reste de 15/10) = 15, chiffreaTester = 1
troisieme itération => chiffre inversé = 15*10 + 1 (reste de 1/10) = 151, chiffreaTester = 0

Donc tu a retourné le chiffre, tu teste si les deux sont les mêmes, et paf Very Happy



LSV

Nombre de messages : 638
Age : 27
Prénom : Jérome
Statut : Diplomé 2013
Localisation : Anderlecht
Date d'inscription : 24/09/2007

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  Bill le Mer 22 Sep 2010, 22:30

C'est ce que j'ai fait pour finir, c'est beaucoup plus simple, mais j'adore me prendre la tête ^^
Merci pour les réponses en tout cas =)

Bill

Nombre de messages : 73
Age : 27
Prénom : Kevin
Statut : Ancien
Localisation : Brussels
Date d'inscription : 07/10/2009

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  smb le Jeu 23 Sep 2010, 11:57

Et toujours en rapport avec la problématique de la précision :

http://melem.developpez.com/tutoriels/langage-c/concepts-avances/?page=flottants#LIII

cheers

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

Re: [C] Résultat bizarre avec les puissances

Message  Contenu sponsorisé Aujourd'hui à 01:07


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum