Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Fehlermeldung ungültige Fließkommarechnung
tahnee - So 29.03.09 19:47
Titel: Fehlermeldung ungültige Fließkommarechnung
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 - So 29.03.09 19:55
Hallo,
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 - So 29.03.09 20:04
Ok vielen Dank schonmal.Aber was ist EPS, le und ABS?
Horst_H - 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 - 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 - 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? :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:
http://docs.codegear.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/DE/html/delphivclwin32/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?
http://www.delphi-library.de/viewtopic.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 - 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 - 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 - 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 - So 29.03.09 23:16
tahnee hat folgendes geschrieben : |
| 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.
tahnee hat folgendes geschrieben : |
| 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!