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

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Points : 63
    Points
    63
    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 Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    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
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

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

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

  4. #4
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    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
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    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é
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    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 ??

  7. #7
    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
    Points : 1 956
    Points
    1 956
    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)

  8. #8
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    sauf qu'un log est plus long à calculer qu'une multiplication ...

    en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    double d=2.0 ;
    int puissance=1 ;
     
    while ( d < gain )
       {
          puissance  = puissance + 1 ;
          d = 2.0 * d ;
       }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    include <math.h>
     
    double puissance=1.0 ;
     
    while ( pow(2.0,puissance) < gain )
       puissance = puissance + 1.0 ;
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    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...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    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
    Points : 1 956
    Points
    1 956
    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;
    }

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Points : 114
    Points
    114
    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

  12. #12
    Membre Expert

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

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par souviron34
    sauf qu'un log est plus long à calculer qu'une multiplication ...

    en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    double d=2.0 ;
    int puissance=1 ;
     
    while ( d < gain )
       {
          puissance  = puissance + 1 ;
          d = 2.0 * d ;
       }
    Est-ce que tu pourrais donner la complexite de ton algorithme et celle utilisant log2 pour qu'on puisse vraiment comparer
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  13. #13
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hegros
    Est-ce que tu pourrais donner la complexite de ton algorithme et celle utilisant log2 pour qu'on puisse vraiment comparer

    ben un log est calculé comme une suite d'après la formule de ... je sais plus qui (Mercator ??), mais qui est en gros :

    ln (1+x) = x - x^2/2 + x^3/3 ....
    (voir http://fr.wikipedia.org/wiki/Logarithme_naturel)

    En tous cas par exemple une discusssion des implémentations peut se trouver ici (http://www.jacques-laporte.org/Logarithm_1.htm) ou ici (http://www2.toki.or.id/book/AlgDesig...OOK/NODE16.HTM).

    Donc les algos varient, mais nécessitent de toutes façons nettement plus d'opérations qu'une (multiplication + addition) ....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

+ 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