IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Calcul rapide du log base 2


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut Calcul rapide du log base 2
    Bonjour,

    les performances de mon programme (audio) ont chutées depuis que je dois calculer un log en base 2 dans une boucle imbriquée.

    Je fais cela de la sorte :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    inline
    float
    LogBase( float x, float base )
    {
      return log(x) / log(base);
    }

    Existe-t-il une astuce pour l'obtenir plus rapidement (même une approximation tout de même asse fine) en C++ évidement.

    D'avance merci pour votre aide.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    déjà ton log(base) il suffit de le calculer une seule fois, et de le stocker...

    Pas besoin de le reclaculer à chaque valeur...

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Oui merci pour ton intervention. Dans mon code, effectivement, je ne le calcule qu'une fois pour toutes.

    Maintenant, je mets ce sujet en délestage car j'ai pu mettre la main sur des bouts de code très sympas à partir du site musicdsp.org

    Or, ce sont vraiment des "trucs" du langage alors cela n'a pas vraiment sa place dans ce forum, désolé.

    Je poste tout de même les fonctions :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    float approxLn2( float f )
    {
      assert( f > 0. );
      assert( sizeof(f) == sizeof(int) );
      assert( sizeof(f) == 4 );
      int i = (*(int *)&f);
      return (((i&0x7f800000)>>23)-0x7f)+(i&0x007fffff)/(float)0x800000;
    }
     
    inline
    float
    fast_log2( float val )
    {
      assert (val > 0);
     
      int * const exp_ptr = reinterpret_cast<int*>(&val);
      int x = *exp_ptr;
      const int log_2 = ((x >> 23) & 255) - 128;
      x &= ~(255 << 23);
      x += 127 << 23;
      *exp_ptr = x;
     
      return (val + log_2);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculs et operation de base
    Par gigiati dans le forum IHM
    Réponses: 2
    Dernier message: 25/12/2007, 20h11
  2. Calcul rapide des valeurs propres d'une matrice creuse
    Par gsagnol dans le forum Mathématiques
    Réponses: 3
    Dernier message: 21/12/2007, 23h37
  3. Calcul rapide de percentiles
    Par benj63 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 08/12/2006, 14h50
  4. Calcul rapide d'une exponentielle ?
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 13/04/2006, 21h12
  5. Réponses: 7
    Dernier message: 15/02/2006, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo