| Autor |
Beitrag |
tahnee
Hält's aus hier
Beiträge: 12
|
Verfasst: So 29.03.09 19:47
Hallo ich habe ein Problem.Ich muss morgen ein Projekt in der Schule abgeben und es funktioniert eig alles, bis auf eine Prozedur.Ich erhalte immer die Felermeldung ungültige Fließkommarechnung
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.horner(); var a:real; begin a:=-10; while x0<>0 do begin a:=a+0.01; x3:=x3; x2:=a*x3+x2; x1:=a*x2+x1; x0:=round(a*x1+x0); end; n3_edt.text:=floattostr(a); x2:=x3; x1:=x2; x0:=x1; pqformel(); end; |
wäre wirklich toll, wenn sich das jemand mal angucken könnte und mir helfen könnte.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: So 29.03.09 19:55
Hallo,
Delphi-Quelltext
x0 ist wahrscheinlich real (float) und round ergibt integer.
Also etwas improvisiert
Delphi-Quelltext 1:
| x0:=int((a*x1+x0)+0.5); |
Aber du vergleichst ein float Zahl gegen 0 , dass geht nicht (fast nie) gut.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure const EPS = 1e-6; var a : real ; .....
while ABS(x0) < Eps do |
Gruß Horst
|
|
tahnee 
Hält's aus hier
Beiträge: 12
|
Verfasst: So 29.03.09 20:04
Ok vielen Dank schonmal.Aber was ist EPS, le und ABS?
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: So 29.03.09 20:25
Hallo,
ist Deine Hilfe kaputt (Cursor auf das Wort und STRG-F1 drücken )
ABS = absolute = Betrag eines Wertes aus minus mach plus sonst nichts.
Eps als Denkstütze für Epsilon , was meist wie delta einen sehr kleinen Wert meint.
Du vergleichst nicht gegen ganz genau 0 sondern auf einen Wert der um +- EPS vom gewünschten Wert abweicht, weil ein Komputer mit Fliesskommazahle nur ungenau rechnen kann (1/3 hört ja auch nie auf, aber irgendwann mus der Rechner Schluß machen )
Also statt Abfrage x= Wert
besser ABS(x-Wert) < Eps abfragen
Gruß Horst
|
|
tahnee 
Hält's aus hier
Beiträge: 12
|
Verfasst: So 29.03.09 20:29
Ok vielen, vielen Dank.
Meine Hilfe ist auf Englisch deshalb kann ich damit nicht viel anfangen...
Aber eine kleine Frage hab ich noch Wieso soll eps le-6 sein und warum rechne int(x...)+0.5???
viel Dank
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 29.03.09 21:08
tahnee hat folgendes geschrieben : | | Meine Hilfe ist auf Englisch deshalb kann ich damit nicht viel anfangen... |
Hast du in der Schule kein englisch?
Solltest du später mehr programmieren wollen, nicht nur jetzt für die Schule, dann wirst du merken, dass du ohne Englisch nicht weit kommst.
Jedenfalls kannst du ja die deutsche Hilfe nehmen:
docs.codegear.com/pr...phivclwin32/idx.html
Ich würde dir raten diese Indexdatei lokal als html-Datei zu speichern, das Laden dauert sonst ggf. eine Weile jedesmal.
Außerdem: Warum lädst du dir nicht einfach eine kostenlose deutsche Version von Delphi mit deutscher Hilfe herunter?
www.delphi-library.d...ewtopic.php?p=539975
tahnee hat folgendes geschrieben : | | Aber eine kleine Frage hab ich noch Wieso soll eps le-6 sein |
Nicht genau 1e-6, also 0,000001, aber die Differenz der zu vergleichenden Werte soll kleiner sein, dann kann man diese als identisch ansehen.
|
|
tahnee 
Hält's aus hier
Beiträge: 12
|
Verfasst: So 29.03.09 21:53
Schonmal vielen Dank für die Hilfe.Habe das Ganze jetzt so geschrieben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.horner(); const EPS= 1e-2; var a:real; begin a:=-10; repeat a:=a+0.0001; x3:=x3; x2:=a*x3+x2; x1:=a*x2+x1; x0:=int((a*x1+x0)+0.5); until ABS(x0)<EPS; n3_edt.text:=floattostr(a); x2:=x3; x1:=x2; x0:=x1; pqformel(); end; |
Aber leider macht er immer noch nichts.Es läuft nur Debugger...
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 29.03.09 21:58
Wird x3 usw. eigentlich irgendwo initialisiert? Wozu weist du x3 den Wert von x3 zu, dass bewirkt doch nix...
Insgesamt ist das ganze durch die globalen Variablen undurchschaubar und unübersichtlich. Schreib die Werte lieber als Parameter, dann kann man das auch ordentlich testen und überblicken...
|
|
tahnee 
Hält's aus hier
Beiträge: 12
|
Verfasst: So 29.03.09 22:08
Stimmt das mit dem x3 gleich x3 ist ein bisschen unsinnig, war da irgendwie so im rechnen per Hand...
Die Variablen x3, x2, x1, x0 sind gobal als real deklariert.Macht wenig Sinn diese lokal zu deklarieren, da ich sie in fast jeder Prozedur brauche.x3 kann zudem nicht 0 werden.Vielen Dank schonmal
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 29.03.09 23:16
|
|