Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - fehlermeldung von gleitkommazahlen


tahnee - Fr 27.03.09 19:10
Titel: fehlermeldung von gleitkommazahlen
hallo,
ich hab folgenden quelltext geschrieben:

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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
procedure TForm1.extremwerte;
var xm1, xm2, y, y1,y2, p, q:extended;
begin
 y2:=6*x3*xm1+2*x2;
 y:=x3*power(xm1,3)+x2*power(xm1,2)+x1*xm1+x0;
 y1:=x3*power(xm2,3)+x2*power(xm2,2)+x1*xm2+x0;
 p:=(2*x2)/(3*x3);
 p:=round(p*100)/100;
 q:=x1/(3*x3);
 q:=round(q*100)/100;
 if (p/2)*(p/2)-q=0
 then
     begin xm1:=-(p/2);

           if y2<0
           then begin maxx_edt.text:=floattostrf(xm1,fffixed,10,3);
                      maxy_edt.text:=floattostrf(y,fffixed,10,3);
                end
           else begin minx_edt.text:=floattostrf(xm1,fffixed,10,3);
                      miny_edt.text:=floattostrf(y,fffixed,10,3);
                end;
    end
 else

   if (p/2)*(p/2)-q<0
   then begin minx_edt.text:='';
              maxx_edt.text:='';
        end
   else
      begin
      xm1:=-(p/2)+sqrt((p/2)*(p/2)-q);
      xm1:=round(xm1*100)/100;
      xm2:=-(p/2)-sqrt((p/2)*(p/2)-q);
      xm2:=round(xm2*100)/100;
      if y2<0
      then begin maxx_edt.text:=floattostrf(xm1,fffixed,10,3);
                 maxy_edt.text:=floattostrf(y,fffixed,10,3);
                 minx_edt.text:=floattostrf(xm2,fffixed,10,3);
                 miny_edt.text:=floattostrf(y1,fffixed,10,3);
           end
      else begin maxx_edt.text:=floattostrf(xm2,fffixed,10,3);
                 maxy_edt.text:=floattostrf(y1,fffixed,10,3);
                 minx_edt.text:=floattostrf(xm1,fffixed,10,3);
                 miny_edt.text:=floattostrf(y,fffixed,10,3);
           end;
      end;
end;



Ich erhalte immer die Fehlermeldung ungültige Gleitkommaoperation.Habs schon mit runden probiert, aber das hat auch leider nicht funktioniert.Wäre wirklich toll, wenn mir jemand helfen könnte.Danke.

Moderiert von user profile iconKha: Delphi-Tags hinzugefügt


jaenicke - Fr 27.03.09 19:16

Hallo und :welcome: hier im Forum!

Deinen Quelltext solltest du hier in Delphi-Tags setzen, sonst kann man den nur schwer überblicken, das hat jetzt user profile iconKha für dich erledigt:

Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAG4d7b645c281c2c5ab26ab5a2fcb5b6ec}</span></span>                    


Wo genau tritt der Fehler denn auf? Hast du es einmal mit einem Haltepunkt und debuggen versucht?


JayEff - Fr 27.03.09 19:17

user profile icontahnee hat folgendes geschrieben Zum zitierten Posting springen:
Ich erhalte immer die Fehlermeldung ungültige Gleitkommaoperation.
In welcher Zeile von dem (leicht verwirrenden :mrgreen: ) code bekommst du den Fehler?


tahnee - Fr 27.03.09 20:16

Der Debugger verweist nur auf die Procedure, auf keine bestimmte Zeile...


Gausi - Fr 27.03.09 20:32

Hallo und :welcome: in der Entwickler-Ecke,

was mir so auffällt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var xm1, xm2, y, y1,y2, p, q:extended;
begin
  y2 := 6*x3*xm1+2*x2;
  y  := x3*power(xm1,3)+x2*power(xm1,2)+x1*xm1+x0;
  y1 := x3*power(xm2,3)+x2*power(xm2,2)+x1*xm2+x0;
  // die markierten Variablen sind nicht initialisiert und können zufällige Werte haben

p:=(2*x2)/(3*x3); // ist sichergestellt, dass x3 ungleich Null ist?
q:=x1/(3*x3); // hier ebenso


jaenicke - Fr 27.03.09 20:38

user profile icontahnee hat folgendes geschrieben Zum zitierten Posting springen:
Der Debugger verweist nur auf die Procedure, auf keine bestimmte Zeile...
Es geht nicht darum nach dem Fehler zu schauen wo du landest, sondern es geht darum vorher zu schauen wann er auftritt.

Setz einen Haltepunkt (F5) auf die erste Quelltextzeile in der Prozedur, dann führ das Programm aus (F9) und gehe dann zeilenweise durch das Programm, wenn Delphi beim Haltepunkt anhält (F8 ).


tahnee - Fr 27.03.09 20:40

x3 ist auf keinen Fall null.
Habe den Quelltext so umgeschrieben, dass y, y1 und y2 erst später ausgerechnet werden, wenn uach die Variablen xm1, xm2 berechnet werden.Kommt trotzdem die gleiche Fehlermeldung...


Marc. - Fr 27.03.09 20:44

:welcome: im Forum!
user profile iconGausi hat ja bereits die wesentlichen Fehler aufgedeckt.
Bist du nun einmal, wie user profile iconjaenicke beschrieben hat, durch den Quelltext gesteppt und hast die einzelnen Werte überprüft? Die Wurzeln werde auch niemals kleiner Null? :zwinker:

BTW: Ich persönlich finde deine Quelltext-Formatierung noch verbesserungswürdig...


tahnee - Fr 27.03.09 20:50

Ja, hab ich gemacht, hat dabei iweder aber nur die procedure an sich angezeigt.
x3 kann nicht null werden (somit keine Division durch null) und die Wurzeln überprüf ich ja vorher...

if (p/2)*(p/2)-q=0


Marc. - Fr 27.03.09 20:53

user profile icontahnee hat folgendes geschrieben Zum zitierten Posting springen:
und die Wurzeln überprüf ich ja vorher...
if (p/2)*(p/2)-q=0

Ja, auf gleich Null, das ist auch legitim. Aber nicht darauf, ob sie negativ sind. :mrgreen:

Edit: Seh gerade, stimmt nicht, was ich erzählt habe. Du überprüfst in der Tat doch. :oops:

Edit2: Wenn du den Haltepunkt hinter das erste begin setzt und anschließend mit F7 durchsteppst, wird der Compiler mit Sicherheit nicht wieder an den Anfang der Prozedur springen. :gruebel:


tahnee - Fr 27.03.09 21:17

Springt zu end. und application.initialize oder zu dem Teil wo ich die Prozeudr
if x3<>0 then begin
horner();
extremwerte();
wendepunkt();
end;


Marc. - Fr 27.03.09 21:23

1) Klick in die Zeile in der folgendes steht:  y2:=6*x3*xm1+2*x2;
2) Drücke F5 (Breakpoint sollte links erscheinen)
3) Drücke F4 und rufe deine Prozedur auf (das Programm sollte nun bis zu dieser Zeile laufen und anschließend in den Debugmodus wechseln)
4) Steppe mit F7 solange durch die Prozdur bis du an der Fehlerstelle angekommen bist

:zwinker:


tahnee - Fr 27.03.09 21:43

Der springt immer nur zu der Stelle an der ich die Prozedur aufrufe...


jaenicke - Fr 27.03.09 21:48

Hast du eine alte Delphiversion? Welche benutzt du? Dann kann ich das genau für die Version zeigen.


tahnee - Fr 27.03.09 21:51

delphi 7