![]() |
Wurzeln in beliebiger Genauigkeit berechnen
Hi, hier ein Algorithmus zur Berechnung von Wurzeln ohne Unit "Math" in beliebiger Genauigkeit nach Heron:
Formel des Heron: ![]()
Delphi-Quellcode:
Chakotay1308 hat den Code in eine eigene Funktion gepackt und somit von der Oberfläche los gelöst:
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;
Delphi-Quellcode:
[edit=Chakotay1308]Code-Style angepasst und eigenen Code druntergesetzt. Mfg, Chakotay1308[/edit]
// 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; |
Re: Wurzeln in beliebiger Genauigkeit berechnen
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 ( :wink: ) 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:
Oder als Funktion:
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;
Delphi-Quellcode:
Hier:
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; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz