/*
Datei............: Aufg0438.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 04.10.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 04.38
Kommentare.......:

Es gibt natuerlich viele Moeglichkeiten, die Quadratwurzel einer
Zahl x iterativ zu bestimmen. Viele davon scheiden wegen ihres
schlechten Laufzeitverhaltens aus. Das nachfolgende Programm 
fuehrt eine iterative Intervalhalbierung durch und verkleinert
dabei schrittweise die Unter- bzw Obergrenze, bis die Differenz
kleiner als 1e-6 ist. 

Dieses Verfahren ist zwar nicht besonders "mathematisch", aber 
leicht zu verstehen un hinreichend schnell. Für eine Zahl x
benötigt es höchsten log(x * 1e6) Schritte zur Bestimmung
der Quadratwurzel, wobei log der Logarithmus zur Basis 2 ist. 
*/
import java.io.*;

public class Aufg0438
{
  public static void main(String args[])
  {
    BufferedReader din = new BufferedReader(
			 new InputStreamReader(System.in));
    double number;

    while (true) {
      System.out.print("Bitte eine positive Fliesskommazahl eingeben (0=Ende): ");
      try {
	number = Double.valueOf(din.readLine()).doubleValue();
	if (number == 0) {
	  break;
	} else if (number > 0) {
	  double lower = 0.0;
	  double upper = number;
	  double middle = 0.0;
	  while (upper - lower > 0.000001) {
	    middle = (lower + upper) / 2.0;
	    if (middle * middle > number) {
	      upper = middle;
	    } else {
	      lower = middle;
	    }
	  }
	  System.out.println("Quadratwurzel aus " + number + " = " + middle);
	}
      } catch (IOException e) {
	System.out.println("  Fehler beim Lesen der Eingabe");
      }
    }
  }
}

