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

  FORUM HardWare.fr
  Programmation
  C++

  abs

 


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

abs

n°1118334
d_imane
Posté le 13-06-2005 à 14:29:51  profilanswer
 

Bonjour à tous,  
:pt1cable: Coment faire pour calculer la valeur absolue de deux float?
Merci

mood
Publicité
Posté le 13-06-2005 à 14:29:51  profilanswer
 

n°1118336
Aldarek
Posté le 13-06-2005 à 14:30:40  profilanswer
 

Un cast non?

n°1118338
Taz
bisounours-codeur
Posté le 13-06-2005 à 14:32:46  profilanswer
 

std::abs

n°1118348
d_imane
Posté le 13-06-2005 à 14:45:06  profilanswer
 

float(abs(a-b)) me rend un entier,moi je cherche à garder les float et calculer leur valeurs absolue
j'ai pas compris ta réponse Taz

n°1118355
fra0
Posté le 13-06-2005 à 14:50:15  profilanswer
 

::fabs(a-b);

n°1118362
Elmoricq
Modérateur
Posté le 13-06-2005 à 14:56:24  profilanswer
 

d_imane a écrit :

j'ai pas compris ta réponse Taz


 
Ben c'est pourtant simple ?
std::abs() fait ce que tu souhaites.

n°1118364
d_imane
Posté le 13-06-2005 à 14:56:53  profilanswer
 

That's it, Thanks fra0.

n°1118365
Taz
bisounours-codeur
Posté le 13-06-2005 à 14:58:45  profilanswer
 

Code :
  1. #include <cmath>
  2. #include <iostream>
  3. int main()
  4. {
  5.    std::cout << std::abs(1.0f - 3.14f) << '\n';
  6. }


 
fabs c'est le truc C parce que y a pas de surcharge. utilise std::abs sur n'importe quoi et ça ira.

n°1118372
d_imane
Posté le 13-06-2005 à 15:03:42  profilanswer
 

maintenant c'est beaucoup plus clair, je retiens ta proposition, merci

n°1118388
d_imane
Posté le 13-06-2005 à 15:13:17  profilanswer
 

but...il m'as sotie un message d'erreur

Code :
  1. float Region::ValRealSubdivision(float mediane,float *x, int dimx)
  2. { float *t,min;
  3.   t=new float[dimx];
  4. for(int i=0;i<dimx;i++)
  5.   //t[i]=fabs(x[i]-mediane);
  6.   t[i]=std::abs(x[i]-mediane);
  7.       min=t[0];
  8. for(i=0;i<dimx;i++)
  9. if(t[i]<min) min=t[i];
  10.   return (min+mediane);
  11. }


error C2039: 'abs' : is not a member of 'std'

mood
Publicité
Posté le 13-06-2005 à 15:13:17  profilanswer
 

n°1118394
skelter
Posté le 13-06-2005 à 15:16:51  profilanswer
 

#include <cmath>
ya une fuite dans ta fonction

n°1118405
d_imane
Posté le 13-06-2005 à 15:21:33  profilanswer
 

si si j'ai utilisé

Code :
  1. #include<cmath>
  2. #include<iostream>
  3. float Region::ValRealSubdivision(float mediane,float *x, int dimx)
  4. { float *t,min;
  5.   t=new float[dimx];
  6. for(int i=0;i<dimx;i++)
  7.       //t[i]=fabs(x[i]-mediane);  
  8.       t[i]=std::abs(x[i]-mediane);
  9.       min=t[0];
  10. for(i=0;i<dimx;i++)
  11.     if(t[i]<min) min=t[i];
  12.       return (min+mediane);
  13. }

n°1118410
fra0
Posté le 13-06-2005 à 15:23:20  profilanswer
 

je parie que tu utilises Borland VC


Message édité par fra0 le 13-06-2005 à 16:30:09
n°1118417
Taz
bisounours-codeur
Posté le 13-06-2005 à 15:26:17  profilanswer
 

très simplement, tu peux encore améliorer :
 

Code :
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <vector>
  4. class Region
  5. {
  6.         public:
  7.         static float ValRealSubdivision(float mediane, float *x, size_t dimx);
  8. };
  9. float Region::ValRealSubdivision(float mediane, float *x, size_t dimx)
  10. {
  11.         std::vector<float> t(dimx);
  12.         for(size_t i = 0; i < dimx; ++i)
  13.                 t[i] = std::abs(x[i] - mediane);
  14.         return mediane + *std::min_element(t.begin(), t.end());
  15. }

n°1118447
fra0
Posté le 13-06-2005 à 15:39:15  profilanswer
 

quand ça marchera,
tu pourras même tout faire en évitant le stockage temporaire
et avec deux fois moins d'itérations.

n°1118496
d_imane
Posté le 13-06-2005 à 16:05:20  profilanswer
 

j'ai utliliser exactement ta fct Taz, et j'ai tjs le meme message d'erreur:'abs' : is not a member of 'std'
j'ulilise la biblio

Code :
  1. #include "stdafx.h"
  2. #include "base.h"
  3. //#include "coder.h"
  4. #include "Region.h"
  5. #include<cstdio>
  6. #include<cmath>
  7. #include <windows.h>
  8. #include<iostream>
  9. #include<ctime>
  10. #include<conio.h>
  11. #include<cstring>
  12. #include<stdlib.h>
  13. #include <fstream>
  14. #include <algorithm>
  15. #include <vector>
  16. using namespace std;

n°1118627
Taz
bisounours-codeur
Posté le 13-06-2005 à 17:36:47  profilanswer
 

Code :
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <vector>
  4. #include <iterator>
  5. class Region
  6. {
  7. class ValRealSubdivisionIterator : public std::iterator<std::input_iterator_tag, float>
  8. {
  9.  const float *x;
  10.  float mediane;
  11.  public:
  12.  ValRealSubdivisionIterator(const float *px, float pmediane = float())
  13.   : x(px), mediane(pmediane)
  14.   { }
  15.  ValRealSubdivisionIterator& operator++()
  16.  {
  17.   this->x++;
  18.   return *this;
  19.  }
  20.  ValRealSubdivisionIterator operator++(int)
  21.  {
  22.   const ValRealSubdivisionIterator last(*this);
  23.   ++*this;
  24.   return last;
  25.  }
  26.  float operator*() const
  27.  {
  28.   return std::abs(*this->x - this->mediane);
  29.  }
  30.  bool operator==(const ValRealSubdivisionIterator &other) const
  31.  {
  32.   return this->x == other.x;
  33.  }
  34.  bool operator!=(const ValRealSubdivisionIterator &other) const
  35.  {
  36.   return not (*this == other);
  37.  }
  38. };
  39. public:
  40. static float ValRealSubdivision(float mediane, float *x, size_t dimx);
  41. static float ValRealSubdivision2(float mediane, const float *x, size_t dimx);
  42. };
  43. float Region::ValRealSubdivision(float mediane, float *x, size_t dimx)
  44. {
  45. std::vector<float> t(dimx);
  46. for(size_t i = 0; i < dimx; ++i)
  47.  t[i] = std::abs(x[i] - mediane);
  48. return mediane + *std::min_element(t.begin(), t.end());
  49. }
  50. float Region::ValRealSubdivision2(float mediane, const float *x, size_t dimx)
  51. {
  52. ValRealSubdivisionIterator first(x, mediane), last(x + dimx);
  53. return mediane + *std::min_element(first, last);
  54. }

pour faire joli

n°1118656
fra0
Posté le 13-06-2005 à 18:21:26  profilanswer
 

std::not ?

n°1118667
Taz
bisounours-codeur
Posté le 13-06-2005 à 18:33:23  profilanswer
 

non, not le mot clef

n°1118685
fra0
Posté le 13-06-2005 à 18:53:00  profilanswer
 

ok (...)

Code :
  1. // pr le fun,
  2.      float Region::ValRealSubdivision3(float mediane, const float *x, size_t dimx)
  3.      {
  4.          std::priority_queue<float, std::deque<float>, std::greater<float> > pq;
  5.          while(dimx--) pq.push(mediane+std::abs(x[dimx]-mediane));
  6.          return pq.top();
  7.      }

n°1118688
Taz
bisounours-codeur
Posté le 13-06-2005 à 18:57:53  profilanswer
 

c'est très très lent ton truc : tu maintiens un ordre pour rien.
 
edit : et tu as un recopies inutile. Seul avantage par rapport à la méthode initiale : ça ne fuit pas

Message cité 1 fois
Message édité par Taz le 13-06-2005 à 18:58:58
n°1118690
fra0
Posté le 13-06-2005 à 19:01:06  profilanswer
 

mais qu'il est lourd celui là....
c'est pour le fun j'ai dit.
 
la solution la plus efficace est évidente

n°1118697
skelter
Posté le 13-06-2005 à 19:10:32  profilanswer
 

pour le fun aussi  :D, histoire d'user le pauvre valarray

Code :
  1. float Region::ValRealSubdivision3(float mediane, const float *x, size_t dimx)
  2. {
  3.     std::valarray<float> t(x, dimx);
  4.     t -= mediane;
  5.     return mediane + t.min();
  6. }


 
edit: c'est quand meme une meilleur soltution ?


Message édité par skelter le 13-06-2005 à 19:12:09
n°1118702
fra0
Posté le 13-06-2005 à 19:15:11  profilanswer
 

c toujours bon les solutions en 3 lignes
 
pour info, dans le files de priorité*, c'est le popage des éléments qui est lent plutôt que leur pushage (facteur 3 avec un vector, 10 avec une deque (dans des tailles cahemissables))
 

n°1118708
Taz
bisounours-codeur
Posté le 13-06-2005 à 19:23:28  profilanswer
 

Code :
  1. float Region::ValRealSubdivision3(float mediane, const float *x, size_t dimx)
  2. {
  3.         float min;
  4.         min = x[0];
  5.         for(size_t i = 1; i < dimx; ++i)
  6.         {
  7.                 const float v = std::abs(x[i] - mediane);
  8.                 if(v < min)
  9.                         min = v;
  10.         }
  11.         return mediane + min;
  12. }


 
 
quant à ton histoire de pop plus lent que push, elle ne veut rien dire, vu que ça dépend très largement de l'implémentation.
 
edit : avec un tas, on a d'ailleurs o(log(n)) en insertion et suppression
edit2 : encore heureux que top() est o(1)


Message édité par Taz le 13-06-2005 à 19:31:14
n°1119039
Kyle_Katar​n
Posté le 14-06-2005 à 01:19:37  profilanswer
 

Fais une macro qui fait (fVal<0.0f)?-fVal:fVal

n°1119113
Taz
bisounours-codeur
Posté le 14-06-2005 à 09:34:46  profilanswer
 

non mais là c'est plus rigolo :o

n°1119144
chrisbk
-
Posté le 14-06-2005 à 10:01:24  profilanswer
 

Kyle_Katarn a écrit :

Fais une macro qui fait (fVal<0.0f)?-fVal:fVal


[:pingouino]

n°1119231
fra0
Posté le 14-06-2005 à 11:07:38  profilanswer
 

Taz a écrit :


quant à ton histoire de pop plus lent que push, elle ne veut rien dire, vu que ça dépend très largement de l'implémentation.


 
teste avant d'être trop péremptoire....
 
quand à ton dernier code j'ai bien peur qu'il soir complètement faux.

n°1119238
Taz
bisounours-codeur
Posté le 14-06-2005 à 11:10:51  profilanswer
 

je comprends pas de quoi tu parles : vu que tu fais n push() et 1 top(), et que top() est o(1), tu te mouilles pas trop en disant que c'est les push() qui prennent du temps.
 
après on s'en fout que ça soit juste ou pas, c'est son algo après tout.

n°1119257
fra0
Posté le 14-06-2005 à 11:21:21  profilanswer
 

justement,
je suis peut être pas très clair,
mais (chez moi, sur ma machine....)
aussi bizarre que cela puisse paraître
ce sont les pop qui prennent du temps

n°1119278
Taz
bisounours-codeur
Posté le 14-06-2005 à 11:31:26  profilanswer
 

mais tu ne fais pas de pop() :o

n°1119324
fra0
Posté le 14-06-2005 à 11:50:40  profilanswer
 

donc la méthode "fun" est efficace
cqfd

n°1119343
Taz
bisounours-codeur
Posté le 14-06-2005 à 11:59:36  profilanswer
 

ben non.
 
utilisation mémoire : n
complexité : n x log(n)
 
alors que l'opération est clairement o(n). C'est la pire des solutions proposées ici.

n°1119359
fra0
Posté le 14-06-2005 à 12:06:28  profilanswer
 

:pt1cable:  
 
que fais ton ValRealSubdivision3 quand x[0]==-1e9f ?

n°1119402
Taz
bisounours-codeur
Posté le 14-06-2005 à 12:39:27  profilanswer
 

je vois pas le problème

n°1119435
fra0
Posté le 14-06-2005 à 13:26:41  profilanswer
 

d'après ton code :  
v : n'est jamais (strictement) négatif
si x[0] est négatif,
v<min : est toujours faux,
 
ta boucle ne sert à rien.
 
pour *x==-1e9f, ton code renvoit mediane - 1 millard quelles que soient les valeurs du tableau (et y'a un autre petit problème)
 
edit 'f','t','a'


Message édité par fra0 le 14-06-2005 à 13:42:12
n°1119472
Taz
bisounours-codeur
Posté le 14-06-2005 à 13:53:36  profilanswer
 

encore une fois on s'en bat de son algo à la con, je sais pas ce que tu cherches à prouver.

n°1119569
xtremdev
Je choisi la formule offensive
Posté le 14-06-2005 à 14:54:40  profilanswer
 

Si on revenait au pb de départ ??? Calculer une valeur absolue d'un type float
 
Question à 15€ et un mars : "Quelle est la différence entre -3.14f et 3.14f ?"
Alors...
 
Réponse : le bit de poid fort.
 
Comme une variable de type float est codée sur 4 octets, on peut donc créer sa propre fonction fabs qui remet à zéro ce bit.
 

Code :
  1. float myfabs(float p_fValue)
  2. {
  3. unsigned long l_nInt32 = *((unsigned long *)((void*)&p_fValue));
  4. l_nInt32 = l_nInt32 & 0x7fffffff;
  5. p_fValue =  *((float *)((void*)&l_nInt32));
  6. return p_fValue;
  7. }


---------------
[ XtremDev ] ~> http://membres.lycos.fr/photozit/
n°1119570
chrisbk
-
Posté le 14-06-2005 à 14:54:49  profilanswer
 

fra0 a écrit :


edit 'f','t','a'


 
consonne

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  abs

 

Sujets relatifs
Plus de sujets relatifs à : abs


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)