Einzelnen Beitrag anzeigen

Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#1

Wurzeln in beliebiger Genauigkeit berechnen

  Alt 3. Feb 2006, 14:22
Hi, hier ein Algorithmus zur Berechnung von Wurzeln ohne Unit "Math" in beliebiger Genauigkeit nach Heron:

Formel des Heron:

http://lamp.clausvb.de/images/heron-formel.gif


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
  x, y, wurzel: real;
begin
  Wurzel := StrToFloat(edit1.text); //Wurzel ist die Zahl uas der die Wurzel gezogen werden soll
  I:=0; //I und J für die Berechnung gebraucht
  J:=0;
  while j=0 do //Berechnen von J
  begin
    inc(I);
    inc(J);
    if I*I < Wurzel/2 then j:=0; //Solange I² kleiner Wurzel-halbe ist die Schleife wiederholen
  end;
  x:=i;
  y:=wurzel;
  i:=0;

  while I<StrToInt(edit2.text) do //edit2 ist die Genauigkeit sprich Anzahl der Durchläufe
  begin
    inc(i);
    y:=(x+y)/2; //An die Wurzel herantasten
    x:=Wurzel/y;
  end;

  edit3.text:=FloatToStr(x); //Anzeige Wurzel der Zahl
  edit4.text:=FloatToStr(x*x); //Anzeige der Berechneten Zahl zum ² zum überprüfen der Genauigkeit
end;
Chakotay1308 hat den Code in eine eigene Funktion gepackt und somit von der Oberfläche los gelöst:
Delphi-Quellcode:
// Wurzel(n) mit acc Durchläufen nach Heronverfahren berechnen
function SqrHeron(n: real; acc: integer): real;
var
  i, j: integer;
  y: real;
begin
  i := 0;
  j := 0;
  
  while j = 0 do
  begin
    inc(i);
    inc(j);
    if i*i < (n/2) then j := 0;
  end;
  
  Result := i;
  y := n;
  i := 0;
  
  for i := 0 to acc do
  begin
    y := (Result+y)/2;
    Result := n/y;
  end;
end;
[edit=Chakotay1308]Code-Style angepasst und eigenen Code druntergesetzt. Mfg, Chakotay1308[/edit]
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat