// deriv2a1.java -  deriv2a's  method 

abstract class deriv
{
 public abstract  double f(double x);
 double approx_deriv(double x, double eps)
    {
      double h, fd0, fd1;
      double f1, f2;

      h = x/2.0;
      fd1 = (f(x+h) - f(x-h))/(2*h);

      do {
          fd0 = fd1;
          h = h/2.0;
          fd1 = (f(x+h) - f(x-h))/(2*h);
          f1 = f(x+h);
          f2 = f(x-h);
          System.out.println("fd0 = " + fd0 +",fd1 = "+ fd1);
         } while(Math.abs(fd0 - fd1) > eps );

      return fd1;

    } // approx_deriv

} //deriv

class myfun extends deriv
{

  public double f( double x)
  {
    return (x*x*x - 100.0);
  } /* poly */

  public double real_deriv( double x)
  {
    return (3*x*x);
  } /* poly */

 
} //myfun

public class deriv2a
{
  public static void main(String[] args)
  {
    double x;
    myfun tr100 = new myfun();

      System.out.println("approx_deriv(5.0) = " +
                      tr100.approx_deriv(5.0, 0.0000001));  
      System.out.println("real_deriv(5.0) = " +
                                 tr100.real_deriv(5.0));
  
  } // main 

}// deriv2a

