1

I am getting a stackoverflow error when I run my program. I am quite knew to java and I could use a bit of advice.

Any help is appreciated!

public class ApproxSquareRoot {

public static float sqrRootRec(float number, float approx, float tol) {
    if((Math.abs((Math.pow(approx,2) - number))<= tol*number)) {
       return approx;
    } else
       return sqrRootRec(number, (approx*approx + number/(2*approx)),tol);


}

public static float sqrRoot(float number, float approx, float tol) {

     while (Math.abs((Math.pow(approx,2) - number))<= tol*number)
     approx = (approx*approx + number)/(approx + approx);
     return approx;
}

}

.

Input number: 43
Input approx: 2.5
Input tol: .1
Output with number = 43.0 approx = 2.5 tolerance = 0.1
Exception in thread "main" java.lang.StackOverflowError

2 Answers2

0

As noted in the comments, please research what a StackOverflowError is, but regardless of that, I shall point out where you are getting a problem. For your recursive calculation, the next estimate is calculated as follows:

return sqrRootRec(number, (approx*approx + number/(2*approx)),tol);

However, for the iterative case, there is:

approx = (approx*approx + number)/(approx + approx);

Note that these two approximations are not equal, so although I haven't checked the maths, if you make your sqrRootRec function use the second form, it should solve the StackOverflowError.

Ken Y-N
  • 14,644
  • 21
  • 71
  • 114
0

In your iterative function, the next iteration becomes:

(approx*approx + number)/(approx + approx)

In your recursive function, it becomes:

(approx*approx + number/(2*approx))

As you see, the parentheses are different. Your recursive function can be written as:

(approx*approx + (number/(2*approx)))

For the iterative function, after one iteration the value becomes:

(2.5 * 2.5 + 43) / (2.5 + 2.5) = 9.85

But for your recursive function it is:

(2.5 * 2.5 + (43 / (2 * 2.5))) = 14.85

That's quite different. Fix the location of the parentheses [the ( and )] and you'll be fine.

Erwin Bolwidt
  • 30,799
  • 15
  • 56
  • 79