/**
 *
 * Programmieraufgabe P-10 (WurzelRechner.java)
 *
 * @author Leonhard Fellermayr
 * @version 1.0
 */

/** Implementierung der Klasse WurzelRechner.
  *
  * Realisiert Approximation an die Quadratwurzel mittels des antiken
  * HERON-Verfahrens.
  *
  */

public class WurzelRechner {

	/* ***** INSTANZVARIABLEN ***** */

	/**
	  * @param EPSILON Gibt an, bis zu welcher Genauigkeit gerechnet werden soll.
	  * @see http://www.die-informatiker.net/viewtopic.php?t=2072
	  * @param a Enthaelt den Wert, dessen Quadratwurzel berechnet werden soll
	  * @param x Enthaelt die derzeitige Naeherung an die Quadratwurzel
	  *
	  */

	final private static double EPSILON = 10e-14;
	private static double a, x;

	/* ***** PRIVATE METHODEN ***** */

	/**
	  * doNaeherung () : Gib den Wert der naechsten Naeherung zurueck, fuehre
	  * diese jedoch noch nicht durch (veraendere also die Variable x nicht)
	  *
	  * @return Vorschau auf den Wert der naechsten Naeherung
	  *
	  */

	private static double doNaeherung () {

		return ((x + (a/x)) / 2);

	} // doNaeherung ()

	/* ***** PUBLIC METHODEN ***** */

	/**
	  * naechsteNaeherung () : Fuehre einen Naeherungsschritt durch, d. h.
	  * speichere den via doNaeherung () ermittelten Wert der naechsten Naeherung
	  * in x und gib diesen Wert zurueck.
	  *
	  * @return Wert der durchgefuehrten Naeherung
	  *
	  */

	public static double naechsteNaeherung () {

		x = doNaeherung ();

		return (x);

	} // naechsteNaeherung ()

	/**
	  * nochUngenau () : Ueberpruefe, ob eine weitere Naeherung ein vom derzeitigen
	  * Naeherungswert abweichendes Ergebnis liefern wuerde.
	  *
	  * Dazu wird der derzeitige Wert von x mit dem Rueckgabewert von doNaeherung ()
	  * verglichen. Sind diese Werte im Rahmen der Fliesskommagenauigkeit des
	  * Rechners gleich, so gib false zurueck.
	  *
	  * Einfache Realisierung durch booleschen Vergleich auf Ungenauigkeit.
	  *
	  * @return Boolescher Wert, der angibt, ob weitere Naeherungen sinnvoll sind
	  *
	  */

	public static boolean nochUngenau () {

		return (Math.abs (x - doNaeherung ()) > EPSILON);

	} // nochUngenau ()

	/* ***** KONSTRUKTOR ***** */

	/**
	  * Konstruktor der Klasse WurzelRechner.
	  *
	  * Erwartet bei Instantiierung einen Wert a, dessen Quadratwurzel berechnet werden
	  * soll. Setzt weiters x als Wert der Naeherun auf den anfaenglichen Wert 1.
	  *
	  * @param a Der Wert, dessen Quadratwurzel berechnet werden soll.
	  *
	  */

	public WurzelRechner (double a) {

		/** Erste NŠherung ist 1 */

		x = 1;

		this.a = a;

	} // Konstruktor WurzelRechner ()

} // Klasse WurzelRechner ()
