Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Floating Point Exception / Klasse wird nicht angezeigt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.10.2004, 15:55 Uhr
Frank71



Hallo,

ich habe hier einen merkwürdigen Effeft:

In meiner Application habe ich eine Klasse TDrive geschrieben, diese soll mir folgende Zeile berechnen:

C++:
int TDrive::forward(double in_v_forward)
{

    double n;
    int errCode;
    if (spindelsteigung !=0.0)
        n =  in_v_forward / spindelsteigung;
    errCode = rotate(n);
    return errCode;
}


bereits bei der "if"-Anweisung steigt er aus.

eine Zuweisung der Folge :
spindelsteigung = 2.5;
hat er noch akzeptiert:

Das zweite Problem: Die Unit: Drive wird zwar unter Projekt-Explorer angezeigt - jedoch nicht im Class-Explorer auf der linken Seite.
Auch nach dem Versuch die Unit nochmals zu entfernen und erneut hinzuzufügen erschien sie nicht im Class-Explorer - bleibt aber in der Projektverwaltung und läßt sich auch debuggen.


Ich benutze Borland C++ Builder 5.0

Gruss
Frank

Dieser Post wurde am 15.10.2004 um 15:56 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.10.2004, 18:19 Uhr
Hans
Library Walker
(Operator)


Hi,

was ist den spindelsteigung für eine Variable? - Ist die global? - oder soll die von wo anders kommen? Jedenfalls hast Du sie in der Funktion nicht definiert, bevor Du damit arbeitest. Ich vermute mal, die Fehlermeldung lautet irgendwie so wie "unknown value", oder "unkekannter Bezeichner". Dann ist noch zu beachten, das ein exakter Vergleich mit Fliesspunktzahlen (also float, double und long double) nicht möglich ist, weil sich die binäre Darstellung der Zahlen von der Dezimalen unterscheidet. (Stichwort Rundungsfehler, und zwar bei der Umrechnung von der dezimalen Darstellung in die Binäre.) Ob das bei der Null jetzt auch gilt weis ich nicht genau, aber für Zahlen wie 0.1 gilt es auf jeden Fall.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.10.2004, 19:06 Uhr
Frank71




Zitat von Hans:
Hi,

was ist den spindelsteigung für eine Variable? - Ist die global? - oder soll die von wo anders kommen? Jedenfalls hast Du sie in der Funktion nicht definiert, bevor Du damit arbeitest. Ich vermute mal, die Fehlermeldung lautet irgendwie so wie "unknown value", oder "unkekannter Bezeichner". Dann ist noch zu beachten, das ein exakter Vergleich mit Fliesspunktzahlen (also float, double und long double) nicht möglich ist, weil sich die binäre Darstellung der Zahlen von der Dezimalen unterscheidet. (Stichwort Rundungsfehler, und zwar bei der Umrechnung von der dezimalen Darstellung in die Binäre.) Ob das bei der Null jetzt auch gilt weis ich nicht genau, aber für Zahlen wie 0.1 gilt es auf jeden Fall.

Hans


Hallo Hans,

spindelsteigung ist eine memberviable von TDrive und als privat deklariert
(TDrive beschreibt eine Antrieb mit Getriebe und Spindelübersetzung - ist also auch für Vorschübe brauchbar).
Die Fehlermeldung lautet genau "Invalid floating point operation".
Bei dem "==" wird es sicherlich Problem geben - ich Prüfe jedoch auf ungleich 0 - das muss gehen.

Gruss
Frank

Dieser Post wurde am 15.10.2004 um 19:07 Uhr von Frank71 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.10.2004, 21:53 Uhr
Hans
Library Walker
(Operator)


Hi again,


Zitat:
Die Fehlermeldung lautet genau "Invalid floating point operation".


Ah ja, "ungültige Fliespunkt operation" also. Dann ist es also gar nicht zulässig, den != operator zu benutzen.

Zitat:
Bei dem "==" wird es sicherlich Problem geben - ich Prüfe jedoch auf ungleich 0 - das muss gehen.

Anscheinend ja nicht. D.h. Du musst die Gleichheit auf Null anders prüfen. Es gibt da einen Satz an Konstanten der in values.h definiert ist. Da gibt es unter anderem MINDOUBLE, die den kleinsten Wert für den Typ double bezeichnet. Wenn dieser Wert, bzw. der absolut-wert davon grösser ist, als der aktuelle Wert deiner Spindelsteigung, kannst Du davon ausgehen, das Deine Spindelsteigung = 0 ist. D.h. der Vergleich müsst etwa so aussehen:

C++:
if (spindelsteigung < fabs(MINDOUBLE))
...



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.10.2004, 15:00 Uhr
Frank71



hmm - die gleiche Fehlermeldung kommt auch wenn ich:
MsgBox->Lines->Add(this->Name+" moving forward:"+ (AnsiString)v_forward);
einfüge
(sehr hartnäckiger Fall)

Gruss
Frank

Dieser Post wurde am 18.10.2004 um 15:00 Uhr von Frank71 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.10.2004, 16:04 Uhr
Frank71



und noch seltsamer:
double test = inits->VorschubSettings.prescanVelocity ;
double test1 = test*test;

bringt auch diese Fehlermeldung in der zweiten Zeile (test zeigt der Debugger mit 30 an).

Dieser Post wurde am 18.10.2004 um 16:12 Uhr von Frank71 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: