Autor Beitrag
kabuco
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 22

WIN 98, WIN 2000, WIN XP Prof., WIN XP Home
Delphi 5
BeitragVerfasst: Mo 12.12.05 16:07 
Habe hier einen Algorithmus, der euch sicherlich interressieren sollte:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var A,X : real;
begin
A := StrToFloat(Edit1.Text);
X := A;
repeat
X := (X+A/X)/2;
until abs(X-A/X)<0.000001;
Label2.Caption := 'Die Wurzel aus '+Edit1.Text+' ist '+FloatToStr(X);
end;


Ich setze mit diesem Code Voraus, das ihr ein Edit1 Feld habt und ein Label namens Label2. Und nartürlich einen Button.
Dieser Algorithmus berechnet die Wurzel aus A bis zur 5. Stelle nach dem Komma genau!

MFG
kab
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Mo 12.12.05 16:36 
Hm, ich würd dafür sqrt() nehmen, oder für die n-te Wurzel aus x einfach power

_________________
Bravery calls my name in the sound of the wind in the night...
kabuco Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 22

WIN 98, WIN 2000, WIN XP Prof., WIN XP Home
Delphi 5
BeitragVerfasst: Di 13.12.05 14:31 
Es ghet ja einfach nur darum, das man mal einen Algorithmus zur Wurzelbestimmung hat. Klar kann man das einfacher bekommen, aber das ist für alle Matheinterressierten unter uns!
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Di 13.12.05 21:45 
Erstaunlich, die Wurzel aus 0 ist "Invalid Floating Point Operation" ;-)
Ivo@CoMRoK
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 258

Win XP
D3 Prof., D7 Pe.
BeitragVerfasst: Di 13.12.05 21:51 
LOL
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 13.12.05 21:57 
Dass es einen Algorithmus gibt, der das kann, ist ja nicht so erstaunlich.
Interessant wäre wenn schon dann die Herleitung. Ausserdem sollte man angeben unter welchen Bedingungen der Algorithmus konvergiert - und wieso die Sache dann bis auf 5 Stellen genau ist.
unforgiven
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win XP
Delphi 2005 Prof.
BeitragVerfasst: Di 13.12.05 22:07 
warum ist einfach zu sagen..intervallschachtelung...man kann auch 0.001 nehmen als abruch... oder 0.00000000001...oder 10^-45...

_________________
Ein Programm ist nur so gut, wie der Programmierer.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 13.12.05 22:19 
@unforgiven: "Intervallschachtelung" ist nur ein Begriff und keine Erklärung. Was ich meinte war ein mathematischer Beweis, wieso gerade sqrt() rauskommt. Und: Als Abbruchkriterium kommt es wohl nicht gut raus, wenn du 1. eine absolute Toleranz setzst und 2. wenn diese noch so weit unter der Maschinengenauigkeit liegt.

Ich meinte eher so, zeigen, dass mit x'=f(x) für Fixpunkt x'=x gerade die Wurzel rauskommt, dann noch zeigen, wieso der Fixpunktsatz gilt. Dann noch eine obere Schranke für den Fehler angeben.

PS: Ich sehe ein, wir sind nicht bei den FAQs. Aber so bringt der Beitrag nicht sehr viel. Kein theoretisches Verständnis und kein praktischer Nutzen.
unforgiven
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win XP
Delphi 2005 Prof.
BeitragVerfasst: Di 13.12.05 23:13 
nun ja, was wir hier mit der schleife bzw dem algorithmus machen is einfach eine intervallannährung...das heronverfahren ist ein nährungsverfahren

hier ist es gut beschrieben

PS.: dieses verfahren geht übrigens für alle wurzeln...egal wir groß der radikant und wie groß der wurzelexponent ist...mann müsste nur den algorithmus ein bisschen umschreiben...aber im großen und ganzen, kann man diesen algortihmus für alle qurzel nehmen...gut ist das für zB einen funktionsplotter...

_________________
Ein Programm ist nur so gut, wie der Programmierer.
bockwurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Mi 14.12.05 17:02 
Ich habe mir mal die Mühe gemacht,
diesen Algorithmus und den "normalen" Sqrt nach Geschwindigkeit zu testen.

Wer ist schneller?
Ich habe mit verschiedenen Werten eine große Schleife durchlaufen und mit Hilfe von GetTickCount die Zeit gemessen.

Der normale Sqrt war etwa um den Faktor 11 schneller !!!
(Compiler ohne Optimierung)
unforgiven
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46

Win XP
Delphi 2005 Prof.
BeitragVerfasst: Mi 14.12.05 17:08 
na ja, wobei das bei schnellen rechnern keinen großen unterschied hat...

große unterschiede werden nur bei komplexen berechnungen mit rekursiven methoden deutlich...da is iterativ oft schneller...

ich würde mal die function von sqrt sehen, wie die das gelöst haben...

_________________
Ein Programm ist nur so gut, wie der Programmierer.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 14.12.05 21:28 
sqrt ist nicht auf Softwarelevel implementiert. Das rechnet die FPU in einem einzigen Assemblerbefehl (fsqrt).
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mi 14.12.05 21:59 
komisch... ich hab nur die D3 Sources, und angeblich ist sqrt in system.pas deklariert - nur kann ich die stelle dort nicht finden :-(

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Alstar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Mi 14.12.05 22:02 
Ich glaube, dass das keinem weh tut, wenn ich hier den Stück Source aus der System.pas poste:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function Sqrt(const X: Extended): Extended;
asm
        FLD     X
        FSQRT
        FWAIT
end;


Alstar
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 15.12.05 01:33 
@Alstar: Die Funktion wird nicht wirklich aufgerufen. Das geschieht in Delphi via "Compiler Magic"; d.h. der Compiler schreibt das grad direkt in den Code rein (geinlinet) und lässt den Funktionsaufruf einfach weg. Bei neueren Delphi Versionen zu mindest.
Rhoda
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 03.02.06 18:23 
Gibt es zu Heronverfahren eigentlich auch eine rekursive Lösung? Die würde mich mal interessieren...
LG Rhoda