misterzinzin
Messages postés112Date d'inscriptionvendredi 27 octobre 2000StatutMembreDernière intervention26 janvier 2011
-
7 janv. 2006 à 00:29
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 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...
verdy_p
Messages postés202Date d'inscriptionvendredi 27 janvier 2006StatutMembreDernière intervention29 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;*/
}