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 :

fonction sur les puissances


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut fonction sur les puissances
    bonjour,
    je calcul un gain. Ensuite je voudrais trouver la puissance de 2 correspondant à ce gain ou la puissance de 2 la plus proche supérieure.

    Exempl: si gain =4096 trouver la puissnace de de 2: 16 car 2^12=4096

    si gain= 10000 , puissance de 2 : 14 car 2^14=16384.

    merci.

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Tu écris ton équation puis tu en déduis la formule à appliquer. Ici tu vas avoir besoin peut être d'utiliser les logarithmes car je crois 2^n = 4096 -> n= ln de quelque chose

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    donc c n= log4096. Comment fait-on log en c? il me faut un log en base 2.

  4. #4
    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
    sinon un algo tout simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    puissance = 0
    dep = 2
     
    tant que puissance(2,puissance) < gain
       puissance = puissance + 1

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Ceci marcherait peut être aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int i = 0;
    while (gain != pow(2,i)) i++;
    Edit: mince ca ressemble à ce que tu as écris souviron Sauf que ma version est buggé

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    je voudrais trouver la puissance de 2 correspondant à ce gain ou la puissance de 2 la plus proche supérieure.
    avec x le nombre dont on doit trouver la puissance de 2 la plus proche :

    (x > 0)

    2^(round(log2(x)))

    avec log2 :

    log2(n) = ln(n) / ln(2)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Joue avec les les oprations binaires (&, |, >>, <<)

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Soit N = 8 = 2^3
    alors (N & (1 << 3)) = 1

    Une fois que tu as compris ca c est tout simple.

    Soit N un nombre au hasard, tu trouve le bit le plus fort egale a 1 dans N. Imaginons que ce bit se trouve a l indice 4.
    cela veut dire que N >= 2^4 et que N < 2^5.
    Il te reste a faire le minimum entre N - 2^4 et 2^5 - N pour trouver la puissance de 2 la plus proche de N.

    Edit : WAOUAAAA j ai mis autant de temps a ecrire ??

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sandball22
    bonjour,
    je calcul un gain. Ensuite je voudrais trouver la puissance de 2 correspondant à ce gain ou la puissance de 2 la plus proche supérieure.

    Exempl: si gain =4096 trouver la puissnace de de 2: 16 car 2^12=4096

    si gain= 10000 , puissance de 2 : 14 car 2^14=16384.

    merci.
    Ebauche de code :
    Code : 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
    25
    26
    27
    28
     
    #include <stdio.h>
    #include <limits.h>
     
    unsigned nearest_power_of_2 (unsigned x)
    {
       int bit = ((UINT_MAX / CHAR_BIT) - 1);
       unsigned m = x << bit;
     
       while (m >> 1 >= x)
       {
          m >>= 1;
       }
     
       return m;
    }
     
    int main (void)
    {
       unsigned i;
       for (i = 1; i < UINT_MAX / 2; i *= 77)
       {
          unsigned np2 = nearest_power_of_2 (i);
     
          printf ("%08X -> %08X\n", i, np2);
       }
       return 0;
    }
    ATTENTION Je ne suis pas sûr que les cas limites soient couverts...

  9. #9
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    sauf qu'un log est plus long à calculer qu'une multiplication ..
    Rha oui tu as tout à fait raison !

    Finalement, je suis arrivé à une implémentation proche de celle d'Emmanuel avec des décalages :

    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
    25
    26
    27
    28
    29
    30
    31
    32
     
    #include <stdio.h>
    #include <math.h>
     
    // nombre de bits pour un entier non signé
    #define NBFUI 32
     
    unsigned int NearestHighestPowerOf2(unsigned int n);
     
    int main(void)
    {
     
    	printf("%u", NearestHighestPowerOf2(1895));
     
    	return 0;
    }
    unsigned int NearestHighestPowerOf2(unsigned int n)
    {
    	unsigned int decalage = 1, i;
     
    	n -= 1;
     
    	for (i = 0; i < NBFUI; i++)
    	{
    		n = n | (n >> decalage);
    		decalage <<= 1;
    	}
     
    	n += 1;
     
    	return n;
    }

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Citation Envoyé par sandball22
    bonjour,
    je calcul un gain. Ensuite je voudrais trouver la puissance de 2 correspondant à ce gain ou la puissance de 2 la plus proche supérieure.

    Exempl: si gain =4096 trouver la puissnace de de 2: 16 car 2^12=4096

    si gain= 10000 , puissance de 2 : 14 car 2^14=16384.

    merci.
    j avais pas fait gaffe au superieur

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

Discussions similaires

  1. Recherche fonction sur les listes
    Par becks dans le forum Général Python
    Réponses: 5
    Dernier message: 05/05/2006, 16h11
  2. Fonction sur les chaines
    Par joquetino dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/11/2005, 22h31
  3. Fonctions sur les dates
    Par Neuromancien2 dans le forum Oracle
    Réponses: 4
    Dernier message: 12/10/2005, 10h13
  4. Réponses: 2
    Dernier message: 01/05/2004, 21h15
  5. [LG]Symbole # (dièse) et fonctions sur les chaînes
    Par James64 dans le forum Langage
    Réponses: 6
    Dernier message: 24/03/2004, 14h19

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