2016-02-01 3 views
-1

J'utilise j2me et j'ai besoin d'obtenir des exp() précises pour des valeurs allant jusqu'à 4. Un problème avec le j2me est que sa bibliothèque mathématique n'a pas la méthode pow() et exp(). Pour résoudre ce problème, je viens d'utiliser cette méthode pour implémenter pow():Comment obtenir une précision Math.exp() dans j2me?

public static double pow(double num1, double num2) { 
    double result = 1; 
    for (int i = 0; i < num2; i++) 
    result *= num1; 
    return result; 
} 

Cela m'a permis d'avoir une fonctionnalité d'exp en utilisant la mise e comme constante (2,718281828459045) et appelant pow:

double calculation = (20.386 - (5132.000/(t + 273.15))); 
System.out.println("calc: " + pow(2.71,calculation)); 
calculation = pow(2.7182818284590452,calculation) * 1.33; 

Mon problème est ce résultat est tout à fait inexact, par exemple, si je compare Math.exp et ma méthode de pow pour le nombre 3,75, les résultats sont comme ceci:

fonction retourne Pow: 54,5980031309658

Math retourne la fonction: 42.52108200006278

Donc, j'aurais besoin de conseils, comment implémenter la fonctionnalité exp dans l'environnement j2me avec la plus grande précision possible.

+0

Votre fonction ne donne aucun sens aux exposants qui ne sont pas des fractions. Êtes-vous surpris que ce n'est pas correct? – duffymo

+1

Duplication possible de [l'implémentation de la fonction mathématique J2ME (double, double)] (http://stackoverflow.com/questions/2076913/j2me-powerdouble-double-math-function-implementation) – agold

+0

@agold que la copie a vraiment mauvaise et réponses incomplètes – Ferrybig

Répondre

1

j'ai aidé moi-même avec Bharat réponse à cette question: How to get the power of a number in J2ME

Comme méthode exp est juste pow, où nous utilisons le nombre d'Euler pour le premier argument, je méthode bharath:

public double powSqrt(double x, double y) 
    { 
     int den = 1024, num = (int)(y*den), iterations = 10; 
     double n = Double.MAX_VALUE; 

     while(n >= Double.MAX_VALUE && iterations > 1) 
     { 
      n = x; 

      for(int i=1; i < num; i++)n*=x; 

      if(n >= Double.MAX_VALUE) 
      { 
       iterations--; 
       den = (int)(den/2); 
       num = (int)(y*den); 
      } 
     } 

     for(int i = 0; i <iterations; i++)n = Math.sqrt(n); 

     return n; 
    } 

Méthode appel:

calculation = powSqrt(2.7182818284590452,calculation) * 1.33; 

Le résultat est presque aussi bon que la méthode Math.pow().

PS: Je ne sais pas s'il s'agit d'un thread dupliqué, si c'est le cas, vous pouvez le supprimer.