Search code examples
javamathjava-me

How to get precise Math.exp() in j2me?


I am using j2me and I need to get quite precise exp() for values up to 4. Problem with the j2me is that it's Math library doesn't have pow() and exp() method. To solve this, I just used this method to implement pow():

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

This enabled me to have exp functionality by using setting e as constant (2.718281828459045) and calling 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;

My problem is that result is quite inaccurate, for example if I compare math.exp and my pow method for number 3,75, results are like this:

Pow function returns: 54.5980031309658

Math function returns: 42.52108200006278

So I would need advice, how to implement exp functionality in j2me environment with highest precision possible.


Solution

  • I helped my self with bharath answer in this question: How to get the power of a number in J2ME

    Since exp method is just pow, where we use Euler's number for the first argument, I used bharath method:

    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;
        }
    

    Method call:

    calculation = powSqrt(2.7182818284590452,calculation) * 1.33;
    

    Result is almost as good as Math.pow() method.

    PS: I don't know if this is duplicated thread, if so you can delete it.