Autor Beitrag
DiedHope
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 23.01.11 16:51 
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:
ausblenden volle Höhe 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
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 23.01.11 17:31 
user profile iconDiedHope hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:
ausblenden 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);


Zuletzt bearbeitet von jaenicke am So 23.01.11 17:37, insgesamt 2-mal bearbeitet
DiedHope Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 23.01.11 17: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 23.01.11 17: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...

Für diesen Beitrag haben gedankt: DiedHope
DiedHope Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: So 23.01.11 17:43 
Okay danke hat alles geklappt.