Autor Beitrag
Mr.AI
Hält's aus hier
Beiträge: 3

WIN XP

BeitragVerfasst: So 26.02.06 16:42 
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:

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:
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 user profile iconChristian S.: Delphi-Tags hinzugefügt
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 26.02.06 16:50 
du kannst keine wurzel aus einer negativen zahl ziehen. erst überpüfen.
Mr.AI Threadstarter
Hält's aus hier
Beiträge: 3

WIN XP

BeitragVerfasst: So 26.02.06 16:53 
wie kann ich sagen, das delphi das erst prüfen soll?
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: 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:

ausblenden Quelltext
1:
2:
3:
4:
5:
try
//tue was
except
//tue was bei fehler
end;


und

ausblenden 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 X0=-p/2. Spart "Rechenzeit"
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: 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.

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 26.02.06 23:41 
einfach:

ausblenden Delphi-Quelltext
1:
if (p*p/4)-q)>0 then sqrt(p*p/4)-q) else doSomeThing;					
DaRkFiRe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 526

WinXP Home & Professional
C, C++, Delphi
BeitragVerfasst: So 26.02.06 23:45 
Genau so meine ich das. Du hast es allerdings schön in Pascal ausformuliert :)

_________________
Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca