Autor |
Beitrag |
kabuco
      
Beiträge: 22
WIN 98, WIN 2000, WIN XP Prof., WIN XP Home
Delphi 5
|
Verfasst: Mo 12.12.05 16:07
Habe hier einen Algorithmus, der euch sicherlich interressieren sollte:
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
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: 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 
      
Beiträge: 22
WIN 98, WIN 2000, WIN XP Prof., WIN XP Home
Delphi 5
|
Verfasst: 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
      
Beiträge: 552
(D3/D7/D8) Prof.
|
Verfasst: Di 13.12.05 21:45
Erstaunlich, die Wurzel aus 0 ist "Invalid Floating Point Operation" 
|
|
Ivo@CoMRoK
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Di 13.12.05 21:51
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 46
Win XP
Delphi 2005 Prof.
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 46
Win XP
Delphi 2005 Prof.
|
Verfasst: 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
      
Beiträge: 191
win98 /XP
D1 D5 Prof DE2005PE
|
Verfasst: 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
      
Beiträge: 46
Win XP
Delphi 2005 Prof.
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 14.12.05 21:28
sqrt ist nicht auf Softwarelevel implementiert. Das rechnet die FPU in einem einzigen Assemblerbefehl (fsqrt).
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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
      
Beiträge: 827
|
Verfasst: 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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| function Sqrt(const X: Extended): Extended; asm FLD X FSQRT FWAIT end; |
Alstar
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
|
Verfasst: Fr 03.02.06 18:23
Gibt es zu Heronverfahren eigentlich auch eine rekursive Lösung? Die würde mich mal interessieren...
LG Rhoda
|
|