Autor Beitrag
tahnee
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: So 29.03.09 19:55 
Hallo,

ausblenden Delphi-Quelltext
1:
x0:=round(a*x1+x0);					

x0 ist wahrscheinlich real (float) und round ergibt integer.
Also etwas improvisiert
ausblenden Delphi-Quelltext
1:
x0:=int((a*x1+x0)+0.5);//int ergibt denb Ganzzahlanteil ist aber vom typ ~float					

Aber du vergleichst ein float Zahl gegen 0 , dass geht nicht (fast nie) gut.
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 29.03.09 20:04 
Ok vielen Dank schonmal.Aber was ist EPS, le und ABS?
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.03.09 21:08 
user profile icontahnee hat folgendes geschrieben Zum zitierten Posting springen:
Meine Hilfe ist auf Englisch deshalb kann ich damit nicht viel anfangen...
Hast du in der Schule kein englisch? :D
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

user profile icontahnee hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 29.03.09 21:53 
Schonmal vielen Dank für die Hilfe.Habe das Ganze jetzt so geschrieben:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.03.09 23:16 
user profile icontahnee hat folgendes geschrieben Zum zitierten Posting springen:
Es läuft nur Debugger...
Wie meinst du das eigentlich? Ich meine, wenn du zeilenweise das Programm laufen lässt, dann siehst du doch was passiert.

user profile icontahnee hat folgendes geschrieben Zum zitierten Posting springen:
Macht wenig Sinn diese lokal zu deklarieren, da ich sie in fast jeder Prozedur brauche.
Immer dann, wenn eine abgeschlossene Berechnung mit bestimmten Werten durchgeführt wird, macht es keinen Sinn diese in globalen Variablen zu verwenden. Dann sollte man das auch modular abschließen und die Werte als Parameter übergeben.