complexité

complexité - C++ - Programmation

Marsh Posté le 27-09-2005 à 00:14:42    

:jap: Bonjour,
Je cherche à calculer la puissance 20ème d'un float donnèes voici le bout du code que j'ai utilisé:

Code :
  1. float RealData::RealDistance(vecteur a,vecteur q)
  2. {
  3. float *sqmax,sumax=0;
  4. sqmax=new float[d];
  5. for(int i=0;i<d;i++)
  6. {
  7. sqmax[i]=powf(fabs(a.coord[i]-q.coord[i]),d);  //ca plante pour d>20
  8. sumax=sumax+sqmax[i];
  9. }
  10. return (powf(sumax,1./d));
  11. }


  :pfff:  probléme:
dès que je prend d trés grand, le programme se plante,comment effectuer le meme calcul d'une manière rigoureuse d'un point de vu complexite
Merci pour toutes proposition


Message édité par d_imane le 27-09-2005 à 00:16:56
Reply

Marsh Posté le 27-09-2005 à 00:14:42   

Reply

Marsh Posté le 27-09-2005 à 00:21:56    

utilise au moins des double plutot que des float

Reply

Marsh Posté le 27-09-2005 à 00:26:38    

debug en pas en pas.  
pour moi c'est pas powf qui plante ou déclenche une exception, c'est que tu sors de tes tableaux...

Reply

Marsh Posté le 27-09-2005 à 00:27:53    

oui mais je dois manipuler des float, ca va diminuer un peux le temps de calcul mais je ne pense pas que cela réglera le problème

Reply

Marsh Posté le 27-09-2005 à 00:28:22    

c'est quoi le message d'erreur ?
 
sinon y'a un delete qui manque...

Reply

Marsh Posté le 27-09-2005 à 00:29:19    

mais ca fonctionne correctement pour des d petites de l'rdre 10,8..

Reply

Marsh Posté le 27-09-2005 à 00:30:29    

et utilise boost::scoped_array<> si tu est autorisé à utiliser des bibliothèques externes.

Reply

Marsh Posté le 27-09-2005 à 00:31:23    

pas  de message d'erreur ca plante uniquement, j'ai essayer ca sur un pc de faible mémoire virtuelle il me sort un message "mémoire faible" j'ai reportere ca su un autre pc plus grand ca fonctionne pour des d<20

Reply

Marsh Posté le 27-09-2005 à 00:32:18    

ton d c'est deux chose: c'est ta puissance de pow, et en même temps la taille de tes tableaux.
 
ton bloc de float pointé par sqmax est toujours à 'd' en taille, mais tes 'vecteur' eux doivent avoir coord[] de constant. (au hasard à 2 ou 3)

Reply

Marsh Posté le 27-09-2005 à 00:32:27    

tu peux me montrer comment bjone??

Message cité 1 fois
Message édité par d_imane le 27-09-2005 à 00:41:35
Reply

Marsh Posté le 27-09-2005 à 00:32:27   

Reply

Marsh Posté le 27-09-2005 à 00:33:08    

d_imane a écrit :

pas  de message d'erreur ca plante uniquement, j'ai essayer ca sur un pc de faible mémoire virtuelle il me sort un message "mémoire faible" j'ai reportere ca su un autre pc plus grand ca fonctionne pour des d<20


 
ça c'est lié a ta fuite mémoire dû au delete qui manque (boost::scoped_array<> ) est ton amis.

Reply

Marsh Posté le 27-09-2005 à 00:33:22    

super fuite de mémoire au passage.

Reply

Marsh Posté le 27-09-2005 à 00:33:55    

d_imane a écrit :

tu peux me montere comment bjone??


 
c'est quoi la définition de ta classe vecteur ?

Reply

Marsh Posté le 27-09-2005 à 00:35:34    

Code :
  1. #define d 20
  2. class vecteur 
  3. {
  4.   public :
  5.      float coord[d];
  6.  vecteur();
  7.  vecteur(float*,int i);
  8.  vecteur(const vecteur &p);
  9.  void afficher();
  10.  void operator=(const vecteur &vect);
  11.  virtual ~vecteur();
  12. };

Reply

Marsh Posté le 27-09-2005 à 00:44:56    

et ton vilain #define d, c'est partout le même ?
 
ton coord[], il est initialisé comment ?
 
et ton virtual ~vecteur() il sert a quelque chose là ?
 
et tout ce petit monde ainsi que l'operator = et les constructeurs par recopie, c'est inutilement implémenté comment ?


Message édité par bjone le 27-09-2005 à 00:48:34
Reply

Marsh Posté le 27-09-2005 à 00:46:47    

#define d 20
 
 
dégage cette connerie.
class Vector {
static const size_t d = 20;
};

Reply

Marsh Posté le 27-09-2005 à 00:47:17    

utilise std::vector

Reply

Marsh Posté le 27-09-2005 à 00:47:51    

ok je vais te donner le fonction:

Code :
  1. vecteur::vecteur(){}
  2. vecteur::vecteur(float *a,int di)
  3. {
  4. for(int i=0;i<di;i++)
  5.    coord[i]=a[i];
  6. }
  7. void vecteur::afficher()
  8. {   cout<<endl;
  9. for(int i=0;i<d;i++)
  10.    cout<<coord[i]<<" ";
  11. }
  12. vecteur::vecteur(const vecteur &p)
  13. {
  14. for(int i=0;i<d;i++)
  15.  coord[i]=p.coord[i];
  16. }
  17. void vecteur::operator=(const vecteur &vect)
  18. {
  19. for(int i=0;i<d;i++)
  20.  coord[i]=vect.coord[i];
  21. }
  22. vecteur::~vecteur(){}

Reply

Marsh Posté le 27-09-2005 à 00:50:24    

Taz a écrit :

#define d 20
 
 
dégage cette connerie.
class Vector {
static const size_t d = 20;
};


cette connerie et partout dans le code je m'en sert dans le main,mais c'est une bonne idée Taz


Message édité par d_imane le 27-09-2005 à 00:51:40
Reply

Marsh Posté le 27-09-2005 à 00:51:55    

# vecteur::vecteur(float *a,int di)
# {
#     for(int i=0;i<di;i++)
#        coord[i]=a[i];
# }
 
dépassement si di > d. (c'est normalement pas la cause de ton pb)
 
vecteur::vecteur(const vecteur &p) & vecteur::operator=(const vecteur &vect) sont inutiles (surtout avec le void :D)
 
et ta fonction initiale:
 
float RealData::RealDistance(vecteur a,vecteur q);
ce sera mieux qu'elle soit en:
float RealData::RealDistance( const vecteur &a, const vecteur &q );
pour des raisons de clarté et de perfs :D

Reply

Marsh Posté le 27-09-2005 à 00:52:45    

ben un #define c'est de la merde en soit. Et si en plus tu choisis un identifiant ridicule ...
 
char d = x;
 
perdu ...

Reply

Marsh Posté le 27-09-2005 à 00:57:40    

l'idée est clair Taz, c vrai ,mais ca ne posera pas le problème de début n'est ce pas?

Reply

Marsh Posté le 27-09-2005 à 00:59:58    

j'aurai pas besoin d'un delete non?? (destructeur)

Reply

Marsh Posté le 27-09-2005 à 01:01:52    

ben si tu fais pas de new, fais pas de delete
 
vector<float> sqmax(variable);
 
for (size_t i = 0; i < variable; ++i)
   sqmax[i]

Reply

Marsh Posté le 27-09-2005 à 01:03:25    

donc ce n'est pas du tout ca le probléme!!

Reply

Marsh Posté le 27-09-2005 à 11:22:50    

ben si au contraire. t'as une fuite de mémoire. Commence par la corriger.

Reply

Marsh Posté le 27-09-2005 à 12:07:08    

tu peux me dire comment??
ah, une remarque:je parie que les grandes puissanes ne sont pas pris en compte par les calculateurs, j'ai essayé n=pow(100,20), pas de valeurs, je crois c'est ca le problème, dés qu'on augmente la puissance on est perdu.. :pt1cable:  


Message édité par d_imane le 27-09-2005 à 12:11:39
Reply

Marsh Posté le 27-09-2005 à 15:36:40    

100^20 = 10^40 hors les variables de type float ne peuvent aller que jusqu'a 3,4 x 10^38. Il y a un overflow la.
 
Utilise des double et tu pourras aller jusqu'a 10^308.

Reply

Marsh Posté le 27-09-2005 à 15:50:18    

Merci pour l'info Angel64

Reply

Marsh Posté le 27-09-2005 à 17:17:56    

Angel64 a écrit :

100^20 = 10^40 hors les variables de type float ne peuvent aller que jusqu'a 3,4 x 10^38. Il y a un overflow la.
 
Utilise des double et tu pourras aller jusqu'a 10^308.


palois(e) ?

Reply

Marsh Posté le 27-09-2005 à 17:55:16    

Nan Nîmois :)

Reply

Marsh Posté le 27-09-2005 à 18:15:22    

et 64 c'est ton QI ? :P ?

Reply

Marsh Posté le 27-09-2005 à 18:58:03    

Nan c'est un nombre important pour moi (mais heureusement pas mon QI lol). Mais ce n'est pas le sujet du topic :)

Reply

Marsh Posté le 30-09-2005 à 21:06:54    

De toute façon, d_imane, ton algo pour le calcul est mauvais, car non seulement avec des grandes puissances, tu risques à tout moment un overflow (ce qu'on voit au premier coup d'oeil), mais tu perds énormément en précision.
En principe, ce n'est pas comme ça qu'il faudrait faire ce calcul, mais je n'ai pas de réponse toute prête sur comment il faut le réaliser, car ça dépend essentiellement de ce que tu en fais après. En réalité, il y a de bonnes chances qu'un bon algo d'analyse numérique zappe complètement ce genre de calcul pour éviter les imprécisions ou instabilités.
 
Et enfin, si tu ne le retournes pas qq part, ton tableau ne sert strictement à rien.
Ceci fait la même chose, sans les bugs.
 

Code :
  1. float RealData::RealDistance(const vecteur &a,const vecteur &q, int d)
  2. {
  3.   double sumax = 0.0;
  4.   for(int i = 0; i < d; i++)
  5.     sumax += pow(fabs(a.coord[i]-q.coord[i]), d);
  6.   return (float) (pow(sumax, 1.0 / d));
  7. }


Message édité par el muchacho le 30-09-2005 à 21:33:02
Reply

Marsh Posté le 30-09-2005 à 21:09:53    

1.0d
powd
 
???

Reply

Marsh Posté le 30-09-2005 à 21:21:15    

Bon ok, pour pow, j'ai pas vérifié s'il y a une version pour double, et pour 1.0, je corrige de suite. (J'ai pas codé sérieusement en C++ depuis un an, j'ai déjà oublié que c'est du double... :pfff: )


Message édité par el muchacho le 30-09-2005 à 21:23:42
Reply

Marsh Posté le 01-10-2005 à 02:35:48    

l'idée est clair el muchacho merci

Reply

Marsh Posté le 01-10-2005 à 16:35:46    

bonjour d_imane. Personne ne t'a expliqué pourquoi le static const est préférable au #define. Pour faire simple, le #define c'est une macro non débuggable (enfin en théorie) qui appartient au langage C. Là tu fais du C++, donc tu déclares ta constante en tant que membre global de ta classe et en plus la valeur est débuggable (que des avantages en somme).

Reply

Marsh Posté le 02-10-2005 à 13:20:58    

:bounce: youuuuuuuuuuupi slash33 est là!!
bonjour,
 ;) ca veut dire quoi une valeur débuggable?

Reply

Marsh Posté le 02-10-2005 à 14:01:45    

une valeur débuggable, çà veut dire que tu pourras y accéder une fois la compilation terminée genre en débugguant.
 
une macro n'existe plus (le preprocesseur applique le #define MACHIN truc en faisant un find & replace de MACHIN par truc dans le code source) avant que le processus de compilation proprement dit ne débute (linkage tout çà), par conséquent tu n'y as plus accés une fois le processus de codage terminé, c'est pour çà entre autre que les macros c'est "sale" dans la plupart des cas.


Message édité par manatane le 02-10-2005 à 14:04:29
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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