Entwickler-Ecke
Sonstiges (Delphi) - Quadratische Gleichung
Mr.AI - So 26.02.06 16:42
Titel: Quadratische Gleichung
hallo,
ich versuch grad Delphi 7 zu lernen (Also noch Anfänger), hoffe ihr könnt mir bei folgenden Problem
helfen:
Also das Programm soll die Gleichung 0=x²+px+q lösen (d ist die Diskriminante).
Wenn d = 0 oder d > 0 ist klappt auch alles. Aber wenn d < 0, bricht das Programm mit der Fehler-
meldung 'ungültige Gleitkommaopertion' ab und im Quelltext wird die Zeile "d := sqrt((p*p/4)-q);"
blau hervorgehoben.
Quelltext:
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: 33: 34:
| var Form1: TForm1; p,q,d,x1,x2 :real; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin p := StrToFloat(Edit1.Text); q := StrToFloat(Edit2.Text); d := sqrt((p*p/4)-q); x1 := -(p/2)+d; x2 := -(p/2)-d; if d < 0 then begin Label1.Caption := 'keine Nullstelle'; Label2.Caption := ''; Label3.Caption := ''; end else if d = 0 then begin Label1.Caption := 'nur 1 Nullstelle'; Label2.Caption := 'x1 = ' + FloatToStrF(x1,ffnumber,4,2); Label3.Caption := ''; end else begin Label1.Caption := ''; Label2.Caption := 'x1 = ' + FloatToStrF(x1,ffnumber,4,2); Label3.Caption := 'x2 = ' + FloatToStrF(x2,ffnumber,4,2); end; end; end. |
Moderiert von
Christian S.: Delphi-Tags hinzugefügt
Delete - So 26.02.06 16:50
du kannst keine wurzel aus einer negativen zahl ziehen. erst überpüfen.
Mr.AI - So 26.02.06 16:53
wie kann ich sagen, das delphi das erst prüfen soll?
Tilo - So 26.02.06 22:52
achtung!
Die Diskriminate ist p²/4-q. Die Wurzel kommt erst in der Lösungsformel!
Um 'Fehler' abzufangen gibt es noch die Konstrukte:
Quelltext
1: 2: 3: 4: 5:
| try //tue was except //tue was bei fehler end; |
und
Quelltext
1: 2: 3: 4: 5:
| try //tue was finally //tue was TROTZ Fehler end; |
Die Nullstellenberechnung kannst Du auch nach Auswertung der Diskrimante vornehmen.
bei D<0 brauchst Du dann nicht rechnen und bei D=0 ist X
0=-p/2. Spart "Rechenzeit"
DaRkFiRe - So 26.02.06 23:40
Ja, aber in der Diskriminantenberechnung ergibt sich die Wurzel aus der negativen reellen Zahl.
Zudem ist die Aussage: "eine Wurzel aus einer negativen Zahl existiert nicht" nur in dem reellen (und damit der Schulmathematik UND der Rechnerform) Körper der Zahlen richtig. Es gibt ja weiterhin noch die komplexen Zahlen. Aber das ist höhere Mathematik, imaginäre Mathematik :)
Also:
Definitionsbereich von der Wurzel (sqrt) ist x >= 0
Du kannst den Wert (p*p/4)-q einer Variable (_d) zuweisen. Dein D wäre dann sqrt(_d) - dann bräuchtest Du auch diesen Wert nicht mehr berechnen (da das Programm aber nicht zeitkritisch scheint, dürfte das kaum ins Gewicht fallen).
Wenn also _d < 0 wird, wird sqrt(_d) MIT SICHERHEIT die Exception auslösen.
Andernfalls kannst Du hier - wie erwähnt - auch mit try...except..end arbeiten, aber angesichts der Tatsache, dass Du hier die Exception durch simple Mathematik vermeiden kannst, brauchst Du diesen Konstrukt hier nicht.
Delete - So 26.02.06 23:41
einfach:
Delphi-Quelltext
1:
| if (p*p/4)-q)>0 then sqrt(p*p/4)-q) else doSomeThing; |
DaRkFiRe - So 26.02.06 23:45
Genau so meine ich das. Du hast es allerdings schön in Pascal ausformuliert :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!