The easy solution if we do not have to worry about creating a RootApproximator class:
public class Main { public static void main(String[] args) { System.out.println("Heron's method: successive approximations"); System.out.println(heron(101)); System.out.println("Math.sqrt"); System.out.println(Math.sqrt(101)); } public static double heron(double n) { double guess = 1; while (!closeEnough(guess, n)) { guess = (guess + (n/guess)) / 2; System.out.println(guess); } return guess; } public static boolean closeEnough(double guess, double n) { final double THRESHOLD = .000000001; return (Math.abs(guess * guess - n)) < THRESHOLD; } }
The more complicated way if we need RootApproximator.java (note that the while loop is in main():
public class RootApproximator { private double answer; private double guess; private final double TOLERANCE = .000000001; public RootApproximator(double n) { answer = n; guess = 1; } public boolean isNotCloseEnough() { return Math.abs(guess*guess - answer) > TOLERANCE; } public double nextGuess() { guess = (guess + (answer/guess)) / 2; return guess; } public double firstGuess() { return guess; } }
In Main.java:
public class Main { public static void main(String[] args) { RootApproximator r = new RootApproximator(20); System.out.println(r.firstGuess()); // Using isNotCloseEnough instead of hasGuesses for readability while (r.isNotCloseEnough()) { System.out.println(r.nextGuess()); } } }