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

  FORUM HardWare.fr
  Programmation
  C++

  complexité

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

complexité

n°1208208
d_imane
Posté le 27-09-2005 à 00:14:42  profilanswer
 

: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
mood
Publicité
Posté le 27-09-2005 à 00:14:42  profilanswer
 

n°1208213
manatane
En vous remerciant, bonsoir
Posté le 27-09-2005 à 00:21:56  profilanswer
 

utilise au moins des double plutot que des float

n°1208215
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:26:38  profilanswer
 

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

n°1208216
d_imane
Posté le 27-09-2005 à 00:27:53  profilanswer
 

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

n°1208217
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:28:22  profilanswer
 

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

n°1208219
d_imane
Posté le 27-09-2005 à 00:29:19  profilanswer
 

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

n°1208220
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:30:29  profilanswer
 

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

n°1208221
d_imane
Posté le 27-09-2005 à 00:31:23  profilanswer
 

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

n°1208222
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:32:18  profilanswer
 

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)

n°1208223
d_imane
Posté le 27-09-2005 à 00:32:27  profilanswer
 

tu peux me montrer comment bjone??

Message cité 1 fois
Message édité par d_imane le 27-09-2005 à 00:41:35
mood
Publicité
Posté le 27-09-2005 à 00:32:27  profilanswer
 

n°1208224
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:33:08  profilanswer
 

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.

n°1208225
Taz
bisounours-codeur
Posté le 27-09-2005 à 00:33:22  profilanswer
 

super fuite de mémoire au passage.

n°1208227
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:33:55  profilanswer
 

d_imane a écrit :

tu peux me montere comment bjone??


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

n°1208228
d_imane
Posté le 27-09-2005 à 00:35:34  profilanswer
 

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

n°1208229
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:44:56  profilanswer
 

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
n°1208230
Taz
bisounours-codeur
Posté le 27-09-2005 à 00:46:47  profilanswer
 

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

n°1208231
Taz
bisounours-codeur
Posté le 27-09-2005 à 00:47:17  profilanswer
 

utilise std::vector

n°1208232
d_imane
Posté le 27-09-2005 à 00:47:51  profilanswer
 

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(){}

n°1208233
d_imane
Posté le 27-09-2005 à 00:50:24  profilanswer
 

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
n°1208234
bjone
Insert booze to continue
Posté le 27-09-2005 à 00:51:55  profilanswer
 

# 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

n°1208235
Taz
bisounours-codeur
Posté le 27-09-2005 à 00:52:45  profilanswer
 

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

n°1208236
d_imane
Posté le 27-09-2005 à 00:57:40  profilanswer
 

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

n°1208237
d_imane
Posté le 27-09-2005 à 00:59:58  profilanswer
 

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

n°1208238
Taz
bisounours-codeur
Posté le 27-09-2005 à 01:01:52  profilanswer
 

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]

n°1208239
d_imane
Posté le 27-09-2005 à 01:03:25  profilanswer
 

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

n°1208406
Taz
bisounours-codeur
Posté le 27-09-2005 à 11:22:50  profilanswer
 

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

n°1208438
d_imane
Posté le 27-09-2005 à 12:07:08  profilanswer
 

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
n°1208757
Angel64
Posté le 27-09-2005 à 15:36:40  profilanswer
 

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.

n°1208778
d_imane
Posté le 27-09-2005 à 15:50:18  profilanswer
 

Merci pour l'info Angel64

n°1208980
Taz
bisounours-codeur
Posté le 27-09-2005 à 17:17:56  profilanswer
 

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) ?

n°1209012
Angel64
Posté le 27-09-2005 à 17:55:16  profilanswer
 

Nan Nîmois :)

n°1209046
Taz
bisounours-codeur
Posté le 27-09-2005 à 18:15:22  profilanswer
 

et 64 c'est ton QI ? :P ?

n°1209088
Angel64
Posté le 27-09-2005 à 18:58:03  profilanswer
 

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

n°1212140
el muchach​o
Comfortably Numb
Posté le 30-09-2005 à 21:06:54  profilanswer
 

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
n°1212149
Taz
bisounours-codeur
Posté le 30-09-2005 à 21:09:53  profilanswer
 

1.0d
powd
 
???

n°1212162
el muchach​o
Comfortably Numb
Posté le 30-09-2005 à 21:21:15  profilanswer
 

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
n°1212315
d_imane
Posté le 01-10-2005 à 02:35:48  profilanswer
 

l'idée est clair el muchacho merci

n°1212479
slash33
Posté le 01-10-2005 à 16:35:46  profilanswer
 

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

n°1212822
d_imane
Posté le 02-10-2005 à 13:20:58  profilanswer
 

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

n°1212837
manatane
En vous remerciant, bonsoir
Posté le 02-10-2005 à 14:01:45  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  complexité

 

Sujets relatifs
complexite d un algorythm ?Structures de données et complexité
complexite algo, question simple[C++] STL et complexité
[Complexité] Cout d'un calcul MD5 | Cout de calcul d'une clé RSAcomplexité
[C] Implémentation de fonctions et calcul de complexitéThéorie de la complexité
Plus de sujets relatifs à : complexité


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