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

Mathématiques Discussion :

Puissance entière de 2 la plus proche


Sujet :

Mathématiques

  1. #1
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut Puissance entière de 2 la plus proche
    Salut à tous,

    voilà je cherche à trouver une fonction qui étant donné un nombre me retourne la pluissance entière de 2 la plus proche.

    Par exemple (appellons cette fonction f)

    f(0.65) = 1/2 car 2^{-1} <= 0.65 <= 2^0 et 0.65 est plus proche de 1/2 que de 1.

    (=> Quand je parle de puissance entière j'entends pas entier ici -1 et 0)

    De la même manière,
    f(2.6) = 2
    f(3.1) = 4
    ...


    Voilà ça a 'air bête mais je n'y arrive pas... comment construire une telle fonction?
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  2. #2
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Tu as une limite pour le nombre à comparer, ou potentiellement, tu peux avoir un nombre à 495 chiffres ?

    Sinon, je voit bien une méthode bien violente avec un tableau associatif qui te stocke la puissance et la valeur associée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1=>2,
    2=>4
    3=>8
    ...
    jusqu'à ta valeur max, et ensuite tu cherches quelles puissances encadrent ton nombre par dichotomie, et il ne te reste plus qu'à comparer en soustrayant (avec une valeur absolue) laquelle est la plus proche de ton nombre...
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  3. #3
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def closest_pow_2(x):
        i=0
        p=1
        while(p<x):
            p=p*2
            i=i+1
        if (p-x)<(x-p/2):
            return i
        else:
            return i-1
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Zavonen : Ca ne marche pas pour les puissances négatives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    f(x)
      p <- floor(log(x)/log(2))
      r <- 2^p
      Si x - r < 2r - x
      Alors :
        Return r
      Sinon :
        Return 2r
    --
    Jedaï

  5. #5
    alex_pi
    Invité(e)
    Par défaut
    Citation Envoyé par titoumimi Voir le message
    Sinon, je voit bien une méthode bien violente avec un tableau associatif qui te stocke la puissance et la valeur associée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1=>2,
    2=>4
    3=>8
    ...
    Euh, sachant qu'une puissance de 2 se calcule en un tour de proc par décalage (allez, ptet 3 ou 4 suivant les cas), c'est quoi l'intéret de devoir faire un déréférencement mémoire pour aller chercher la valeur dans une case de tableau ?

  6. #6
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    Citation Envoyé par alex_pi Voir le message
    Euh, sachant qu'une puissance de 2 se calcule en un tour de proc par décalage (allez, ptet 3 ou 4 suivant les cas), c'est quoi l'intéret de devoir faire un déréférencement mémoire pour aller chercher la valeur dans une case de tableau ?
    Je pensait que ça rendrait la recherche plus facile J'suis pas très doué en temps de calcul
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  7. #7
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Tu peux aussi utiliser les logarithmes. L'entier que tu cherches est une valeur arrondie de log(x)/log(2).

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Ulmo Voir le message
    Tu peux aussi utiliser les logarithmes. L'entier que tu cherches est une valeur arrondie de log(x)/log(2).
    Incorrect, par exemple log2(0.72) est plus proche de 0 que de -1, mais 0.72 est plus proche de 0.5 que de 1. Je ne sais pas à quoi servira cette fonction, mais selon les spécifications un simple arrondi du log2 ne suffira pas. L'algorithme que j'ai donné plus haut fonctionne par contre.

    --
    Jedaï

  9. #9
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Zavonen : Ca ne marche pas pour les puissances négatives.
    Faut bien qu'il reste un petit qqch à faire. Les puissances négatives sont les puissances positives de l'inverse, non ?
    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
    def closest_pow_2_p(x):
        i=0
        p=1
        while(p<x):
            p=p*2
            i=i+1
        if (p-x)<(x-p/2):
            return i
        else:
            return i-1
     
    def closest_pow_2_n(x):
        return -closest_pow_2_p(1/x)
     
    def closest_pow_2(x):
        if x>=1:
            return closest_pow_2_p(x)
        else:
            return closest_pow_2_n(x)
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Ce serait si simple en manipulant la représentation. On peut presque y arriver si le langage fournit les primitives adéquates, quelque chose comme (non teste)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double f(double v) {
       int exp;
       double mant = frexp(v, &exp);
       return lexp(floor(mant*2+0.5), exp-1);
    }
    (Mais le floor est du gâchis, ce qu'on voudrait c'est masquer les bits; enfin, les cas où c'est utile de faire de telles manip sont rares au point que je me demande ce que ca couterait de faire le masquage en terme de rupture de communication entre unites flottante et entieres).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Parfait, l'algorithme de Jedai fonctionen très bien, que la force soit avec lui (lol d'accord elle était nulle la feinte ;-))
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  12. #12
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    dixit Jean Marc Bourquet
    Ce serait si simple en manipulant la représentation.
    et il a parfaitement raison!
    OK! l'algo de Jedaï résoud le pb de façon satisfaisante, inutile de chercher plus loin. Mais il y a là quelque chose d'illogique.
    On reconstruit la représentation d'un flottant à base des logarithmes de base 2 alors que de façon interne on a déjà cette représentation.
    Prenons le cas des floats sur 32 bits.
    les premiers 23 bits représentent la mantisse
    les 8 bits suivants l'exposant augmenté de 127
    le bit de poids fort le signe
    Il suffit d'isoler la mantisse
    de déterminer la position du bit de poids fort (n)
    de remplacer la mantisse par 1
    d'ajouter n à l'exposant
    et on aura la représentation float du nombre cherché.
    Bien sûr c'est plus ch. à écrire que la solution Jedaï, qui masque une grande complexité par deux appels à une fonction transcendante de la bibliothèque.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  13. #13
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Sans compter que le language de programmation dans lequel on va vouloir implémenter ta solution dans le cas où il n'est pas possible de manipuler les nombres binairement par mantisse (sans compter le fait que dans mon cas je ne me restreint pas aux puissances de 2) risque de rendre l'algorithme moins performant que la solution de Jedai.

    Mais je note l'idée, pas mal du tout...
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  14. #14
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    J'ai le temps encore de proposer une solution, rapide???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    x=y-1    '=== y est le nombre de départ 
    x=x|(x>>16)
    x=x|(x>>8)
    x=x|(x>>4)
    x=x|(x>>2)
    x=x|(x>>1)
     
    x=x+1  '=== x contient la puissance de 2 juste supérieure à y
    z= x>>1 '=== x contient la puissance de 2 juste inférieure à y
     
    si (x-y<y-z) alors afficher y sinon afficher z

    Y-a plus rapide?
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  15. #15
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    Y-a plus rapide?
    Y a surtout le problème qu'on ne travaille pas avec des entiers mais avec des flottants... Ca doit être possible d'y arriver malgré cela, mais plus compliqué.

    De plus Razgriz a précisé qu'il voulait aussi pouvoir le faire avec d'autres puissances que 2.

    --
    Jedaï

  16. #16
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    oups, sorry, j'avais pas lu... m'enfin, les flottants, ici, t'as juste à les tronquer

    Concernant les autres puissances, j'ai vu des méthodes via décalage pour 3 et 5...
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  17. #17
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Nemerle Voir le message
    oups, sorry, j'avais pas lu... m'enfin, les flottants, ici, t'as juste à les tronquer

    Concernant les autres puissances, j'ai vu des méthodes via décalage pour 3 et 5...
    Ouais, par exemple on tronque 1e50... Non, faut extraire la mantisse et l'exposant et faire quelques calculs.

    Et effectivement y a des méthodes par décalage pour 3 et 5 mais c'est pas forcément très pratique, ni performant, ni généraliste. Et puis tu fais quoi comme équivalent de tes masques ?

    --
    Jedaï

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

Discussions similaires

  1. Arrondi au multiple le plus proche ...
    Par Marco85 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 21/07/2009, 13h56
  2. [Ingres] Est-il plus proche de Transac ou d'Oracle ?
    Par tomsoyer dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 23/03/2006, 13h31
  3. [C#][VS2003] Arrondir un float à l'inférieur le plus proche
    Par gregos dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/11/2005, 12h14
  4. Recherche de point le plus proche [façon optimal]
    Par norwy dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/10/2005, 17h15
  5. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 13h52

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