Solved

# Calculate Pow() and Log() without using java.math

Posted on 2007-11-19
2,171 Views
Hi there,
I needed to do some mathematics in an exercice but I am not allowed to use the java.math class, I need to calculate the power Pow() and logarithm log()  with a custom base, base 10 would work as well.
thank you so much!
0
Question by:zorfael
• 5
• 3
• 2

LVL 17

Expert Comment

You can use this POW function:

``````Example 8

double pow(double a, double b)

{

// true if base is greater than 1

boolean gt1 = (Math.sqrt((a-1)*(a-1)) <= 1)? false:true;

int oc = -1; // used to alternate math symbol (+,-)

int iter = 20; // number of iterations

double p, x, x2, sumX, sumY;

// is exponent a whole number?

if( (b-Math.floor(b)) == 0 )

{

// return base^exponent

p = a;

for( int i = 1; i < b; i++ )p *= a;

return p;

}

x = (gt1)?

(a /(a-1)): // base is greater than 1

(a-1); // base is 1 or less

sumX = (gt1)?

(1/x): // base is greater than 1

x; // base is 1 or less

for( int i = 2; i < iter; i++ )

{

// find x^iteration

p = x;

for( int j = 1; j < i; j++)p *= x;

double xTemp = (gt1)?

(1/(i*p)): // base is greater than 1

(p/i); // base is 1 or less

sumX = (gt1)?

(sumX+xTemp): // base is greater than 1

(sumX+(xTemp*oc)); // base is 1 or less

oc *= -1; // change math symbol (+,-)

}

x2 = b * sumX;

sumY = 1+x2; // our estimate

for( int i = 2; i <= iter; i++ )

{

// find x2^iteration

p = x2;

for( int j = 1; j < i; j++)p *= x2;

// multiply iterations (ex: 3 iterations = 3*2*1)

int yTemp = 2;

for( int j = i; j > 2; j-- )yTemp *= j;

// add to estimate (ex: 3rd iteration => (x2^3)/(3*2*1) )

sumY += p/yTemp;

}

return sumY; // return our estimate

}
``````
0

LVL 17

Accepted Solution

CSecurity earned 200 total points
And easier one:

`````` public static int pow(int arg, int times){

int ret = 1;

for ( int i = 1 ; i <= times ; i++ ) {

ret = ret * arg;

}

return ret;

}
``````
0

LVL 9

Assisted Solution

brunoguimaraes earned 300 total points
public long pow(int x, int y) {

long r = 1;

for (int i = 0; i < y; i++) {
r = r * x;
}
return r;
}

// base 2 log
public int log(int x) {

int r = 0;
while ((x >> r) != 0) {
r++;
}
return r - 1;
}
0

LVL 2

Author Comment

Thank you for your effort however the "Math" class can never be mentioned and Pow() should work with numbers like 0.53232333 for example and I can't pass a number like that as "int". the Log() function should be base 10 or custom base. In fact I need Pow() to calculate Exponential, Sin, Cosine, if you guys had those functions as well that would be great but with just the Pow() my numbers will come out good because they do if I use math.pow().
any other solutions?
thank you so much
0

LVL 2

Author Comment

actually I made it to work with double numbers using brunoguimaraes solution but I still need a logarithm function that would the same value as the function below but whithout using the Math class:

public double Log(double a, double base)
{
double x;
x = math.log10(a)/math.log(base)
}

any ideas?
return x;
}
0

LVL 2

Author Comment

CSecurity Pow() solution works just like brunoguimaraes's solution when updated to use double instead of int.
0

LVL 17

Expert Comment

My first example was in Double base itself:

double pow(double a, double b)
0

LVL 2

Author Comment

sure, however you referenced "Math" on your code:
"Math.sqrt"
I can't use that but that's not the problem right now as I got that figured out,
I need to calculate the Logarithm in a custom base now, any ideas?
thank you!
0

LVL 9

Assisted Solution

brunoguimaraes earned 300 total points
Try the code below. The greater the decimalplace parameter is, the greater the precision.
``````public static double log(double x, int base, int decimalplace) {

int integer_value = 0;

while (x < 1) {

integer_value--;

x = x * base;

}

while (x >= base) {

integer_value++;

x = x / base;

}

double decimal_fraction = 0.0;

double partial = 1.0;

x = pow(x, 10);

while (decimalplace > 0) {

partial = partial / 10;

int digit = 0;

while (x >= base) {

digit++;

x = x / base;

}

decimal_fraction = decimal_fraction + digit * partial;

x = pow(x, 10);

decimalplace--;

}

return integer_value + decimal_fraction;

}
``````
0

LVL 2

Author Closing Comment

thank you all!
0

## Featured Post

This is a research brief on the potential colonization of humans on Mars.
Whether you’re a college noob or a soon-to-be pro, these tips are sure to help you in your journey to becoming a programming ninja and stand out from the crowd.
Viewers learn how to read error messages and identify possible mistakes that could cause hours of frustration. Coding is as much about debugging your code as it is about writing it. Define Error Message: Line Numbers: Type of Error: Break Down…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.