public class NumericTest extends Object {

    public static double func(double x) {
	return x*x;
    }

    public static double integrate(double a, double b, int n) {
	double delta = (b-a)/n; 
	double x = a;
	double result = 0.0d;

	while (x < b) {
	    double newx = x + delta;
	    result = result + (delta * ((func(x) + func(newx)) / 2));
	    x = newx;
	}
	return result;
    }

    public static double integrate_f1(double a, double b, int n) {
	double delta = (b-a)/n; 
	double x = b;
	// should be double x = a;
	double result = 0.0d;

	while (x < b) {
	    double newx = x + delta;
	    result = result + (delta * ((func(x) + func(newx)) / 2));
	    x = newx;
	}
	return result;
    }

    public static double integrate_f2(double a, double b, int n) {
	double delta = (b-a)/n; 
	double x = a;
	double result = 0.0d;

	while (x < b) {
	    double newx = x + delta;
	    result = result + (delta * ((func(x) + func(x)) / 2));
	    // should be result = result + (delta * ((func(x) + func(newx)) / 2));
	    x = newx;
	}
	return result;
    }

    public static double differentiate(double x, double diff) {
	double xp = x + diff;
	double y = func(x);
	double yp = func(xp);
	return (yp-y)/(xp-x);
    }

    public static double differentiate_f1(double x, double diff) {
	double xp = x + diff;
	double y = func(x);
	double yp = func(diff);
	// should be double yp = func(xp);
	return (yp-y)/(xp-x);
    }

    public static double differentiate_f2(double x, double diff) {
	double xp = x + diff;
	double y = func(x);
	double yp = func(xp);
	return (xp-x)/(yp-y);
	// should be return (yp-y)/(xp-x);
    }

    public static void main (String[] args)
    {
	// System.out.println("Start main ..");

	double result = integrate(0.0d,1.0d,32000);
	// System.out.println("Result (integrate) = " + Float.toString((float)result));
	result = integrate_f1(0.0d,1.0d,32000);
	// System.out.println("Result (integrate_f1) = " + Float.toString((float)result));
	result = integrate_f2(0.0d,1.0d,32000);
	// System.out.println("Result (integrate_f2) = " + Float.toString((float)result));

	result = differentiate(0.0d,3.0d);
	// System.out.println("Result (differentiate 1) = " + Float.toString((float)result));
	result = differentiate_f1(0.0d,3.0d);
	// System.out.println("Result (differentiate_f1 1) = " + Float.toString((float)result));
	result = differentiate_f2(0.0d,3.0d);
	// System.out.println("Result (differentiate_f2 1) = " + Float.toString((float)result));

	result = differentiate(2.0d,3.0d);
	// System.out.println("Result (differentiate 2) = " + Float.toString((float)result));
	result = differentiate_f1(2.0d,3.0d);
	// System.out.println("Result (differentiate_f1 2) = " + Float.toString((float)result));
	result = differentiate_f2(2.0d,3.0d);
	// System.out.println("Result (differentiate_f2 2) = " + Float.toString((float)result));

	// System.out.println(".. end main");
    }
}
