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
  //Umwandlung der Eingaben
  a := strtofloat(EdA.Text);
  b := strtofloat(EdB.Text);
  c := strtofloat(EdC.Text);

  //Diskriminante
  d := b*b-4*a*c;
  EdDabc.Text := floattostr(d);

  //Berechnungsteil
  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 user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - So 23.01.11 16:31

user profile iconDiedHope hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
  else
  if d = 0 then
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...
user profile iconDiedHope hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconDiedHope hat folgendes geschrieben Zum zitierten Posting springen:
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.