Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Teiler Problem einam da einmal nicht da

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 ]
000
27.10.2004, 22:50 Uhr
Ocrana



Hallo,

ich habe folgendes Problem: In zwei Anwendungen habe ich ein und dieselbe Klasse. In dieser Werden Punkte berechnet:

dDegree = (double)(m_ptKnob.X - Point.X ) / (double)(m_ptKnob.Y - Point.Y );

In der Anwendung A knickt der Debugegr weg und zeigt mir einen "Floating-point division by zero" an wenn:

dDegree = (double)(50 - 22 ) / (double)(50 - 50);

auftritt. ABER in der Anwedung B wenn das gleiche passiert mit exact den gleichen Werten, kommt keine Meldung und das Prog läuft weiter durch.

Hat hier jemand eine IDee warum das so ist?

Gruß

Ocrana
--
-=ShrinkTo5 - The DVDShrink alternative=-
--=http://www.shrinkto5.com=--

Dieser Post wurde am 27.10.2004 um 22:51 Uhr von Ocrana editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.10.2004, 00:10 Uhr
ao

(Operator)


Könnten Rundungsfehler sein. Mit "exakt den gleichen Werten" ist das bei Fließkomma so ne Sache.

Was ist denn bei Anwendung B das Ergebnis der Rechnung? Müsste ja was sehr großes sein.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.10.2004, 00:30 Uhr
Ocrana



Hallo,

Das Ergebnis ist 0 in B. Sollte auch so sein wenn durch 0 geteilt wird. m_ptKnob.Y und Point.Y sind ja vordefinierte Int Werte somit ist es dann immer 0 auch wenn zum double gecastet wird.

Ocrana
--
-=ShrinkTo5 - The DVDShrink alternative=-
--=http://www.shrinkto5.com=--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.10.2004, 01:55 Uhr
Snoopy



Äh also wenn man was durch 0 teilt dann ist das nicht 0. durch 0 teilen ist doch verboten. hast du da schonmal reindebuggt und gekuckt, ob die werte wirklich gleich sind? Normalerweise müsste der immer den Fehler bringen, wenn m_ptKnob.Y == Point.Y.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.10.2004, 07:22 Uhr
Tommix



'Morgen,
bei Division durch Null kommt IMHO keine Fehlermeldung, sondern das Ergebnis wird auf einen ungültigen Wert gesetzt (1.#INF00). Ein Fehler kommt, wenn der Ausdruck bereits beim Compilieren ausgewertet werden kann:

C++:
// läuft:

#include <stdio.h>

int main ()
{
    double a = 1.0, b = 1.0;
    double c = 1.0/(a-b);

    printf ("%f", c);
    return 0;
}

// läuft nicht:

#include <stdio.h>

int main ()
{
    double c = 1.0/0.0;

    printf ("%f", c);
    return 0;
}



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.10.2004, 09:55 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Öhm eigentlich kommt bei einer Devision durch Null immer ein Fehler
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.10.2004, 10:11 Uhr
ao

(Operator)


Wenn es tatsächlich so ist, dass m_ptKnob und Point mit konstanten Werten vorbelegt sind, und dass da garantiert und exakt (50 - 50) entsteht, dann verstehe ich nicht, wie der Code laufen kann.

Die oben gezeigte Codezeile liefert als Ergebnis niemals 0, das kann nicht sein.

Ocrana, zeig doch mal etwas mehr Code aus der Umgebung. Ist dieses Point möglicherweise eine Variable, die eine Mausklick-Position oder ähnliches enthält?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.10.2004, 10:30 Uhr
Tommix



"Herr Doktor, Herr Doktor, alle ignorieren mich."
"Der nächste bitte."

Diese Proggi läuft bei mir wirklich durch:

C++:
#include <stdio.h>

int main ()
{
    double a = 1.0, b = 1.0;
    double c = 1.0/(a-b);

    printf ("%f", c);
    return 0;
}


und gibt auf dem Bildschirm

Zitat:

1.#INF00


aus.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.10.2004, 10:57 Uhr
ao

(Operator)



Zitat von Tommix:
Diese Proggi läuft bei mir wirklich durch:

C++:
#include <stdio.h>

int main ()
{
    double a = 1.0, b = 1.0;
    double c = 1.0/(a-b);

    printf ("%f", c);
    return 0;
}


und gibt auf dem Bildschirm

Zitat:

1.#INF00


aus.

Das Ergebnis ist korrekterweise Unendlich und nicht, wie Ocrana meint, 0.

Könnte es vom Exception-Handling abhängen, ob das Programm läuft (und sich drauf verlässt, dass mit dem Infinity-Wert korrekt umgegangen wird) oder von sich aus einen Fehler wirft?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
28.10.2004, 21:12 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Ich denke mal das der Compiler die Rechnung einfach rausoptimiert. Wenn du das Programm so änderst das die Null erst zur Laufzeit bekannt wird, bekommst du IMHO immer einen Fehler.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


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: