Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Mitternachtsformel - Programm fast fertig
DiedHope - So 23.01.11 15:51
Titel: Mitternachtsformel - Programm fast fertig
Hallo
ich bin gerade dabei ein Schulprojekt zu programmieren das anhand der abc-Formel(Mitternachtsformel) die Nullstellen berechnet.
Es läuft eig. alles einwandfrei nur habe ich jetzt ein Problem und zwar wenn ich 100x²+50x+25=0 rechnen möchte bekomme ich eine Fehlermeldung.
Fehlermeldung: Im Projekt Projekt1.exe ist eine Exception der Klasse EInvalidOp aufgetreten. Meldung: 'Ungültige Gleitkommaoperation'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Hier der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.BtLoeseABCClick(Sender: TObject); var a,b,c,x1,x2,d: real; begin a := strtofloat(EdA.Text); b := strtofloat(EdB.Text); c := strtofloat(EdC.Text);
d := b*b-4*a*c; EdDabc.Text := floattostr(d);
if d < 0 then begin EdX1abc.Text := 'Keine Lösung'; EdX2abc.Text := 'Keine Lösung'; end else if d = 0 then begin x1 := -b / (2*a); EdX1abc.Text := floattostr(x1); EdX2abc.Text := 'Nur eine Lösung'; end else x1 := (-b + sqrt(d)) / (2*a); EdX1abc.Text := floattostr(x1); x2 := (-b - sqrt(d)) / (2*a); <-- diese Zeile ist beim Programmabsturz blau hinterlegt. EdX2abc.Text := floattostr(x2); end; |
Im Anhang befindet sich der gepackte Ordner mit samt allen Dateien
PS.: ich habe bei Google oder in der SuFu nicht hilfreiches gefunden
LG DiedHope
Moderiert von
Narses: Delphi-Tags hinzugefügt
jaenicke - So 23.01.11 16:31
Das ist schon einmal falsch. Ich schau gleich nochmal drüber. Aber so kann es ein winziger Wert über 0 sein (Rundungsfehler durch Binärsystem im PC) und es ist nur
fast gleich Null, so dass dein Code nicht geht.
Das musst du
immer mit IsZero aus der Unit Math prüfen.
// EDIT:
Und das Problem ist, dass du zwar ausgibst, dass es keine Lösung gibt, wenn d < 0 ist, aber dennoch danach versuchst damit zu rechnen...
DiedHope hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| if d < 0 then begin EdX1abc.Text := 'Keine Lösung'; EdX2abc.Text := 'Keine Lösung'; end else if d = 0 then begin x1 := -b / (2*a); EdX1abc.Text := floattostr(x1); EdX2abc.Text := 'Nur eine Lösung'; end else x1 := (-b + sqrt(d)) / (2*a); EdX1abc.Text := floattostr(x1); x2 := (-b - sqrt(d)) / (2*a); | |
DiedHope - So 23.01.11 16:36
Okay danke ich werde mal gucken ob ich das hin bekomme.
was genau macht der Befehl IsZero und wo muss ich den einfügen
Edit: muss ich also statt else einen neuen if block setzen oder wie?
jaenicke - So 23.01.11 16:39
DiedHope hat folgendes geschrieben : |
| Edit: muss ich also statt else einen neuen if block setzen oder wie? |
Nein, einfach das in begin..end setzen, damit das alles nur bei else ausgeführt wird...
DiedHope - So 23.01.11 16:43
Okay danke hat alles geklappt.
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!