Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » If-anweisung wird ignoriert...

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 < [ 2 ] [ 3 ]
000
07.01.2004, 18:39 Uhr
Lumina



Hallo, das was ich jetzt frage ist zwar wahrscheinlich eine Kleinigkeit, aber ich komm im Moment einfach nicht dahinter...

im folgenden Source wird egal, welchen Wert die Det-Fkt zurückgibt, immer der if-Zweig ausgeführt. Die Det(erminante) wird aber richtig ausgerechnet, das hab ich bis zum Umfallen getestet.

Wo ist der Fehler?

C-Source:

C++:
case '2':
    printf(" Matrix wird invertiert....<ENTER>");
    getch();
    if (Det(matrix, Rang) != 0) MatrInv(matrix, Rang);
    else printf(" Determinante ist gleich Null! \n"
              "=> Matrix hat nicht vollen Rang und kann somit auch nicht invertiert werden.\n");
                    break;


--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.01.2004, 18:41 Uhr
0xdeadbeef
Gott
(Operator)


Det liefert wahrscheinlich einen double zurück. Durch Rundungsfehler wird der so gut wie nie ganz genau 0 sein. Normalerweise macht man sowas dann über einen Epsilon-Vergleich, also:

C++:
if(abs(Det(matrix, Rang)) > 0.001) MatrInv(matrix, Rang);


Das Epsilon kannst du, je nachdem, wie genau das sein muss, auch kleiner oder größer wählen. Die Idee sollte, denke ich, klar werden.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.01.2004 um 18:42 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.01.2004, 18:46 Uhr
Lumina



oh, stimmt, so gehts!
Allerdings bekomme ich jetzt 2 Warnungen:

C:\Programme\DevStudio\MyProjects\Studienarbeit2Prog\Studienarbeit2Prog.c(73) : warning C4244: 'function' : Konvertierung von 'double ' in 'int ', moeglicher Datenverlust
C:\Programme\DevStudio\MyProjects\Studienarbeit2Prog\Studienarbeit2Prog.c(73) : warning C4761: Größenkonflikt im Argument. Konvertierung vorgenommen
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************

Dieser Post wurde am 07.01.2004 um 18:47 Uhr von Lumina editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.01.2004, 18:49 Uhr
Lumina



wenn ich in int caste, gehts doch auch, allerdings ohne Warnungen...

oder?

C++:
if ((int)Det(matrix, Rang) != 0) MatrInv(matrix, Rang);


--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.01.2004, 18:52 Uhr
Lumina



und das hier liefert einen fatal error:

C++:
if (Det(matrix, Rang) != 0.00) MatrInv(matrix, Rang);



warum ?
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.01.2004, 19:08 Uhr
0xdeadbeef
Gott
(Operator)


Ja, klar. Mein Fehler. Richtig ist es so:

C++:
if([b]fabs[/b](Det(matrix)) < 0.001) MatrInv(matrix, rang);



In int zu casten wird auch Bei Determinanten von 0.5 oder so 0 liefern, und bei dem Vergleich mit 0.00 wirst du genau die selben Probleme wie bei deinem ursprünglichen Code haben. Warum das einen fatal error liefert, ist mir aber unklar.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.01.2004, 19:14 Uhr
Lumina



was ist der Unterschied zwischen abs und fabs?
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.01.2004, 19:16 Uhr
Lumina



jetzt kommt ne andere Warnung:

warning C4013: 'fabs' undefiniert; Annahme: extern mit Rueckgabetyp int

was muss ich da noch includieren? math.h?
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.01.2004, 19:17 Uhr
Lumina



anscheinend...

dann bedanke ich mich mal wieder für die schnelle und excellente Hilfestellung und geb mich zufrieden.

Danke!
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************

Dieser Post wurde am 07.01.2004 um 19:20 Uhr von Lumina editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.01.2004, 19:26 Uhr
0xdeadbeef
Gott
(Operator)


Jepp, math.h. fabs gibt den Betrag eines übergebenen doubles zurück, abs den Betrag eines übergebenen ints. labs den eines übergebenen longs.

Ist den klar, warum der Epsilon-Vergleich nötig ist?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.01.2004 um 19:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


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: