Midlet j2me ou est passé java.lang.Math.log

misterzinzin Messages postés 112 Date d'inscription vendredi 27 octobre 2000 Statut Membre Dernière intervention 26 janvier 2011 - 7 janv. 2006 à 00:29
verdy_p Messages postés 202 Date d'inscription vendredi 27 janvier 2006 Statut Membre Dernière intervention 29 janvier 2019 - 9 avril 2008 à 02:04
bonjour, je vien de commencer la programmation de midlet (java pour
mobile) et je ne trouva pas la fonction permettant de calculer des
logarithme dans les api du j2me...



quelqu'un sait-il comment résoudre le problème ? (car moi g pas trouvé...)



a moi que qq me dise comment résoudre cette équation sans logarithme

2^x=y

y=log(x)/log(2) ///ou encore le logarithme en base 2 de X



en fait c'est une maniere simple de trouver le nombre de bits (x) nécaissaire pour mémoriser
y valeur différentes. (le programme est plus complexe que cette simple fonction mais cette dernière m'est indispensable...)



ps: si des mathématicien travaillais chez sun il n'auraient certainement pas bougé la fonction log de la classe Math...


moi, le seul, l'unique, ZinZin

1 réponse

verdy_p Messages postés 202 Date d'inscription vendredi 27 janvier 2006 Statut Membre Dernière intervention 29 janvier 2019
9 avril 2008 à 02:04
Cette méthode résoud ton problème de logarithme entier (note: le paramètre est considéré comme non signé, pour les valeurs négatives la méthode retourne 31, pour 1 la méthode retourne 0 (également pour 0 qui n'est pas testé spécialement), pour 2 ou 3 elle retourne 1, pour 4 à 7 elle retourne 2.

Pour ton problème (nombre de bits nécessaires pour stocker "num" valeurs différentes, ce serait un peu différent: il suffit d'ajouter 1 au résultat.

Code optimal (5 tests uniquement quel que soit la valeur de num, les tests sont groupés dans un ordre très précis correspondant à une recherche dichotomique dans une liste de bornes à partir de laquelle le logarithme retourné est incrémenté).

(ce bout de code est utilisé en production depuis des années dans un projet open-source GPL à qui je l'ai envoyé pour résoudre les problèmes d'arrondis causés par Math.log pour les valeurs de num élevées, mais j'en suis l'auteur et je ne réserve pas de droit particulier à celui-ci; je garantis un résultat exact).

    public static byte log2(int num) {
        //Binary search submitted by Philippe Verdy uses 5 comparisons.
        //Previously "return (byte)(Math.log(num) / Math.log(2))", but that had
        //potential rounding errors.
        if      (num <             0x10000)
            if      (num <           0x100)
                if      (num <        0x10)
                    if      (num <     0x4)
                        if  (num <     0x2) return  0; else return  1;
                    else if (num <     0x8) return  2; else return  3;
                else if (num <        0x40)
                    if      (num <    0x20) return  4; else return  5;
                else if (num <        0x80) return  6; else return  7;
            else if (num <          0x1000)
                if      (num <       0x400)
                    if      (num <   0x200) return  8; else return  9;
                else if (num <       0x800) return 10; else return 11;
            else if (num <          0x4000)
                if       (num <     0x2000) return 12; else return 13;
            else if (num <          0x8000) return 14; else return 15;
        else if (num <           0x1000000)
            if      (num <        0x100000)
                if      (num <     0x40000)
                    if      (num < 0x20000) return 16; else return 17;
                else if (num <     0x80000) return 18; else return 19;
            else if (num <        0x400000)
                if      (num <    0x200000) return 20; else return 21;
            else if (num <        0x800000) return 22; else return 23;
        else if (num <          0x10000000)
            if      (num <       0x4000000)
                if      (num <   0x2000000) return 24; else return 25;
            else if (num <       0x8000000) return 26; else return 27;
        else if (num <          0x40000000)
            if      (num <      0x20000000) return 28; else return 29;
        else/*if(num <          0x80000000)*/return 30;/*else return 31;*/
    }
0
Rejoignez-nous