
package javacodebook.misc.deb_assert;

/**
 * Berechnung einer Quadratwurzel zur Demonstration von Assertions
 * @author  Mark Donnermeyer
 */
public class Sqrt {
    
    static double DELTA = 0.000001;
    
    public static void main(String[] args) {
        if (args.length < 2)
            printUsage();
        try {
            double zahl  = Double.parseDouble(args[0]);
            double delta = Double.parseDouble(args[1]);
            double result = sqrt(zahl, delta);
            System.out.println("sqrt(" + zahl + ") = " + result);
        }
        catch (AssertionError e)
        {
            System.out.println("FEHLER: " + e.getMessage());
        }
    }
    
    public static double sqrt(double number, double delta) throws IllegalArgumentException {
        // Wurzeln von negativen Zahlen kann die Methode nicht berechnen.
        if (number < 0)
            throw new IllegalArgumentException();
        
        // Eine Intervallschachtel für die Berechnung der Wurzel. Die Schleife
        // bricht nach 10 Durchgängen ab. Das kann zu Problemen führen ...
        double min = 0, check = 0, max = number;
        for (int i=0; i<10; i++) {
            check = ((max-min)/2)+min;
            if ((check*check) > number)
                max = check;
            else
                min = check;
        }
        
        // Sicherstellen, dass die Wurzeln genau genug ist.
        assert (number-(min*min)) < delta:"Wurzel zu ungenau";
        return min;
    }
    
    private static void printUsage() {
        System.out.println("Aufruf: java [-ea] javacodebook.misc.deb_assert.Sqrt <zahl> <delta>");
        System.exit(0);
    }    
}
