AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Algorithmen Delphi Wurzeln in beliebiger Genauigkeit berechnen

Wurzeln in beliebiger Genauigkeit berechnen

Ein Thema von inherited · begonnen am 3. Feb 2006 · letzter Beitrag vom 23. Jul 2006
Antwort Antwort
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
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Wurzeln in beliebiger Genauigkeit berechnen

  Alt 23. Jul 2006, 14:21
Michael Habbe hat für den obigen Code einige Verbesserungen:

Die Wurzel wird zwar auch berechnet, aber es ist nicht das Verfahren nach Heron, es werden auch mehr Durchläufe benötigt. Auch kann man Wurzeln negativer Zahlen ermitteln, was ja bekanntlich nicht funktioniert ( )
Und zwar müssten die Zeilen 24+25 des ersten Quelltextes und die Zeilen 23+24 der Funktion getauscht werden mit Abänderung der Ausgabe der Variablen.

Alternativ kann auch der Code verwendet und die Originale ersetzt werden (der Startwert wird auf 1 gesetzt):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, r: Double;
  i: Integer;
begin
  r := StrToFloat(Edit1.Text); // Die Zahl, aus der die Wurzel ermittelt wird

  a := 1; // Startwert

  for i := 1 to StrToInt(Edit2.Text) do // Anzahl der Annäherungsdurchläufe
  begin
    a := 0.5 * (a + r/a); // Heron-Verfahren
  end;

  Edit3.Text := FloatToStr(a); // Anzeige Wurzel der Zahl
  Edit4.Text := FloatToStr(a*a); // Anzeige der Berechneten Zahl zum Quadrat zum überprüfen der Genauigkeit
  Edit5.Text := FloatToStr(sqrt(r)); // Ausgabe der "richtigen" Wurzel
end;
Oder als Funktion:
Delphi-Quellcode:
function SqrtHeron(r: Double; anz: Integer): Double;
var
  i: Integer;
begin
  result := 1; // Startwert
  for i := 1 to anz do // Anzahl der Annäherungsdurchläufe
  begin
    result := 0.5 * (result + r/result); // Heron-Verfahren
  end;
end;
Hier: http://www.arndt-bruenner.de/mathe/s...heronframe.htm findet man nützliche Informationen, auch wie man die n.te Wurzel mit diesem Verfahren berechnen kann.
»Mein Kaffee ist so schwarz — der fängt gleich an zu rappen...«
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf