Entwickler-Ecke

Sonstiges (Delphi) - Heron-Verfahren zur Annäherung an Quadratwurzeln


Delete - Sa 30.08.03 14:25
Titel: Heron-Verfahren zur Annäherung an Quadratwurzeln
Da das Heron-Verfahren relativ interessant & einfach zu schreiben ist, habe ich hier einmal den Quellcode :

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function InitialValueForHeron(a : Extended): Extended;
var
i : integer;
begin
i := 2;
repeat
  Result := Power(i,2);
  Inc(i);
  until Power(i,2) >= a
end;


function heronAlgorithm(xN,a : extended; rounds : integer): extended;
var
i : integer;
begin
 for i :=  1 to rounds do
    begin
    xN := (xN + a/xN) / 2;
    end;
   result := xN;
end;

Nätürlich lässt sich das ganze auch mit sqrt(x) per Delphi-Interner Funktion machen, aber wo bleibt da die Herausforderung :wink: ?

Paul


FeG - Sa 30.08.03 15:23
Titel: Re: Heron-Verfahren zur Annäherung an Quadratwurzeln
Hi,
Hast du jetzt dazu eine Frage, oder ist das einfach nur so??
PaulG hat folgendes geschrieben:
Nätürlich lässt sich das ganze auch mit sqrt(x) per Delphi-Interner Funktion machen, aber wo bleibt da die Herausforderung :wink: ?

Ähhh... Warum hast du's dann gepostet, wenn's ne Herausforderung sein soll???

MfG,
FeG


Terra23 - Sa 30.08.03 15:26

@FeG: Wenn ich richtig vermute, wollte er das als FAQ-Beitrag schreiben und von den Usern hier bewerten lassen..


Delete - Sa 30.08.03 17:37

Jup. Bin leider im Forum "verrutscht".


FeG - Sa 30.08.03 18:02

Terra23 hat folgendes geschrieben:
@FeG: Wenn ich richtig vermute, wollte er das als FAQ-Beitrag schreiben und von den Usern hier bewerten lassen..

Axo... da bin ich gar nicht drauf gekommen, bin noch neu hier...

Aber jetzt die Bewertung: :wink:

Ich find, FAQ wär's, wenn man sqrt() reinschreibt... der Heron-Algorithmus ist eher was zum Tüfteln und selber probieren. Wenn jemand eine Wurzelfunktion braucht, soll er/sie lieber sqrt() verwenden...

Sonst müsste man's als Tutorial nehmen und dann den Aufbau des Algos Schritt für Schritt erklären...

Oder wie seht ihr das?

MfG,
FeG


Delete - Sa 30.08.03 18:27

Ok ok also nochmal erklärt damit alle zufrieden sind :lol:
Ich gebs ja zu, nur für die interresant die auch mal andere Verfahren probieren wollen


InitialValueForHeron berechnet einen passenden Startwert für den Heron-Algorithmus :
A stellt den Radikanden dar. Wir wollen nun eine ganzahlige Näherung für den Radikanden finden.
Der Zähler i hat den Startwert 2, dann wird i^2 genommen, i inkrementiert, solange bis das i + 1 (also Inc(i)) größer oder gleich a ist.
Da bei der until-Abfrage nichts zugewiesen wird, gilt dann als Ergebnis das vorherige a.

Damit sind alle Vorbereitungen abgeschlossen :
Der Startwert ist x[0] := InitialValueForHeron(a).
Der Radikand a bleibt bestehen, es wird auch die Rundenanzahl (Genauigkeit) Rounds zugewiesen

Heron-Algorithmus :
Was jetzt passiert ist eine Mittelwertsannäherung des Radikands A
xN := (xN + a/xN) / 2
und das verpackt in eine For-Schleife, die zu der Rundenanzahl hochzählt.

Bei großen Extended-Zahlen reichen bereits 40 Runden und Delphi rundet den Näherungswert xn zu xN^2 = a.

mfG
Paul