Heronverfahren Java Quadratwurzel von 2?

2 Antworten

Es handelt sich doch um ein Annäherungsverfahren. Das heißt, mit jeder Iteration wird dein Ergebnis genauer, aber ja, du kannst dabei auch gegen einen unendlichen Wert konvergieren.

a) Du legst einen Präzisionswert fest, wie viele Annäherungsschritte es maximal geben soll. Wenn diese durchlaufen wurden, wird das Ergebnis so wie es ist genommen.

b) Du definierst eine Zieldifferenz. Erst wenn diese eingehalten wird, bricht die Rekursion ab. Dabei müsstest du aber vorsichtig sein und wieder etwas probieren, andernfalls löst sich dein Problem nicht.

dennisschmitt 
Fragesteller
 15.11.2019, 18:52

Danke für die Hilfe, also beim Heronverfahren ändern sich die ersten 5 Nachkommastellen nach 6 Durchgängen ja nicht mehr sind also genau. So wie ich das verstanden habe. Wie genau würde ich dass dann machen. Ich könnte zwar eine Klassenvariable machen und die prüfen aber ich möchte das alles in der Methode schreiben.

0
regex9  15.11.2019, 19:06
@dennisschmitt

Du gibst alle notwendigen Werte als Parameter mit. Da wäre also einmal ein Parameter, der dir die aktuelle Anzahl an Durchläufen (Rekursionstiefe) verrät und einen Parameter, der die maximale Rekursionstiefe bestimmt. Je Schritt wird dann geprüft, ob der erste Parameter den selben Wert wie der zweite Parameter erreicht hat.

Pseudocode:

repeat(iteration, maxIteration):
  if (iteration == maxIteration):
    return
  repeat(iteration + 1, maxIteration)

# call:
repeat(0, 6)

Das Beispiel kannst du für deinen Fall adaptieren.

0

Von Prüfen auf Gleichheit ist bei Fließkommazahlen grundsätzlich abzuraten. Das kann immer schiefgehen. Üblicherweise prüft man, ob die Abweichung kleiner ist als ein vorgegebener Wert ("epsilon").

Daneben oder stattdessen kann man auch eine (maximale) Anzahl von Schleifendurchläufen angeben - dazu ist es aber hilfreich, wenn man am Anfang schon eine Abschätzung machen kann. (Hierzu hilft es zu wissen, dass das Heron-Verfahren das Newton-Verfahren für die Quadratwurzel ist)

Alternativ prüft man, ob man auf einen periodischen Umlauf kommt - wenn das Verfahren in der Theorie konvergiert und in der Praxis nicht divergiert, stößt man immer irgendwann auf eine Periode.

Woher ich das weiß:Berufserfahrung – Software-Entwickler
dennisschmitt 
Fragesteller
 15.11.2019, 18:49

Danke für die Hilfe, also das man auf die Schleifendurchgänge prüft hatte ich auch im Kopf aber ich wollte es rekursiv schreiben. Und wie genau würde ich auf epsilon prüfen. Ich kenne epsilon nur beim Grenzwert/ Limes aber wüsste jetzt nicht wie ich das einbauen könnte..

0
dennisschmitt 
Fragesteller
 15.11.2019, 19:00
@dennisschmitt

Frage hat sich erledigt, habe es mit Epsilon hinbekommen. Danke für den Tipp !

0