C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Division durch Null

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Gregor Lehninger
Guest





PostPosted: Wed May 09, 2007 12:29 am    Post subject: Division durch Null Reply with quote



hallo



ich habe ein problem mit der division durch 0. als eingefleischter

pascal programmierer habe ich erwartet, dass eine exception auftritt

die mich waehrend der programmentwicklung auf solche fehler hinweist.

ist in c nicht so, sondern als ergebnis erhaelt man -1.#IND. ist zwar

ziemlich ... weil ich nie, wirklich nie eine unendlich grosse zahl

gebrauchen kann, aber ok. jetzt koennte man meinen, dass irgendwann in

der weiteren folge ein problem durch diese zahl auftritt, war bei mir

aber nicht der fall, weil:



int in = (int)floor(1.0 / float(out.size()-1);



naemlich die schoene zahl 0 liefert.

D.h., wenn die groesse des vektors genau 1 ist, tritt eine gleitkomma

division durch 0 auf, das ergebnis ist daher -1.#IND, wenn ich diesen

wert aber in einen integer caste ((int)(-1.#IND)) kommt 0 raus. Das

ist zufaellig in ordnung, weil die variable "in" der index in einen

vector ist, der mindestens 1 element enthaelt, daher kommt ueberhaupt

keine fehlermeldung.



jetzt kommts aber... diese behandlung ist prozessor abhaengig! auf

meinen athlon xp's und dem intel P3 funktioniert alles, auf mehreren

pentium 4 rechnern nicht. die fehlermeldung lautet "vector

subscription out of range". das heisst, "in" ist nach dem type cast

auf int nicht 0!

auf den pentium 4 rechnern kann ich leider nicht testen.



ich habe nun schon stunden nach exceptions oder compiler einstellungen

gegoogelt aber ohne erfolg.

ich suche nach einer loesung, wie ich alle solche faelle moeglichst

auf einmal abfangen kann, ich moechte nicht alle meine berechnungen

extra auf division durch 0 untersuchen muessen, da es sich bereits um

ein ausgewachsenes projekt handelt.

am besten waere es, wenn das programm bei einer gleitkommadivision

durch 0 einfach abbrechen wuerde.

kann mir dabei jemand helfen?



meine entwicklungsumgebung ist VC++ 2005
Back to top
Rolf Magnus
Guest





PostPosted: Thu May 10, 2007 1:29 am    Post subject: Re: Division durch Null Reply with quote



Gregor Lehninger wrote:

Quote:
ich habe ein problem mit der division durch 0. als eingefleischter

pascal programmierer habe ich erwartet, dass eine exception auftritt

die mich waehrend der programmentwicklung auf solche fehler hinweist.

ist in c nicht so, sondern als ergebnis erhaelt man -1.#IND.

Genauer gesagt ist das Ergebnis undefiniert. Das ist übrigens auch in C so.

Quote:
jetzt kommts aber... diese behandlung ist prozessor abhaengig!

Nicht nur. Sie kann auch vom Betriebssystem, vom Compiler oder den
Compilereinstellungen abhängen.

Quote:
ich suche nach einer loesung, wie ich alle solche faelle moeglichst

auf einmal abfangen kann, ich moechte nicht alle meine berechnungen

extra auf division durch 0 untersuchen muessen, da es sich bereits um

ein ausgewachsenes projekt handelt.

Es gibt keine portable Lösung. Eine Division durch Null ist ein Fehler und
darf nicht vorkommen.

PS: Reparier mal deine Shift-Taste und den Zeilenumbruch.
Back to top
Thomas Maeder
Guest





PostPosted: Thu May 10, 2007 2:09 am    Post subject: Re: Division durch Null Reply with quote



Gregor Lehninger <grex (AT) gmx (DOT) at> writes:

Quote:
ich habe ein problem mit der division durch 0. als eingefleischter
pascal programmierer habe ich erwartet, dass eine exception auftritt
die mich waehrend der programmentwicklung auf solche fehler
hinweist.

In C und C++ haben solche Operationen undefiniertes Verhalten.


Quote:
ist in c nicht so, sondern als ergebnis erhaelt man -1.#IND.

Das mag bei der Implementation zutreffen, die Du gerade verwendest,
aber nicht im allgemeinen. Und das gilt auch für alles folgende.
Back to top
Bob Hairgrove
Guest





PostPosted: Thu May 10, 2007 2:10 am    Post subject: Re: Division durch Null Reply with quote

Quote:
...Division durch Null...



Laut Paragraph 5.5 des C++ Standards ist Division durch Null
undefiniertes

Verhalten in C++. Da jedes Plattform (bzw. Fließkommaeinheit oder
Prozessor)

anders darauf reagiert, sollte man entweder auf Plattform- bzw.
Bibliothek-Ebene

die nötigen Vorkehrungen treffen, oder (besser noch) diesen Fall, wenn
möglich,

durch geeignete Programmstrukturen von vornherein ausschliessen.



--

Bob Hairgrove

NoSpamPlease (AT) Home (DOT) com
Back to top
Gregor Lehninger
Guest





PostPosted: Thu May 10, 2007 3:04 am    Post subject: Re: Division durch Null Reply with quote

danke,

in einer anderen newsgroup habe ich eine fuer mich sehr gute loesung

erhalten. damit werden auch auf meinem prozessor exceptions bei div/0

ausgeloest und ich konnte damit herausfinden wo die fehler auftreten,

ohne das gesamte projekt durchzuackern :-)





#ifndef _WIN32

#include <unistd.h>

#include <fcntl.h>

#include <fenv.h>

#endif



#ifdef _WIN32

#include <float.h>

#endif





//------------------------------------------------------------------------------

void enableFloatingPointExceptions(bool v)

{

#ifdef _WIN32

// always call _clearfp before masking a FPU exception

_clearfp();

if(v)

{

_controlfp_s(NULL, _EM_INEXACT | _EM_UNDERFLOW , _MCW_EM);

}

else

{

_controlfp_s(NULL, _EM_OVERFLOW | _EM_ZERODIVIDE |

_EM_INVALID

| _EM_DENORMAL | _EM_INEXACT | _EM_UNDERFLOW , _MCW_EM);

}

#else



feclearexcept( FE_ALL_EXCEPT );

if(v)

{

feenableexcept( FE_DIVBYZERO | FE_OVERFLOW | FE_INVALID );

} else

{

fedisableexcept( FE_ALL_EXCEPT );

}

#endif

}



On Wed, 09 May 2007 23:10:52 +0200, Bob Hairgrove

<invalid (AT) bigfoot (DOT) com> wrote:



Quote:




...Division durch Null...







Laut Paragraph 5.5 des C++ Standards ist Division durch Null

undefiniertes



Verhalten in C++. Da jedes Plattform (bzw. Fließkommaeinheit oder

Prozessor)



anders darauf reagiert, sollte man entweder auf Plattform- bzw.

Bibliothek-Ebene



die nötigen Vorkehrungen treffen, oder (besser noch) diesen Fall, wenn

möglich,



durch geeignete Programmstrukturen von vornherein ausschliessen.
Back to top
Marcel Müller
Guest





PostPosted: Thu May 10, 2007 1:16 pm    Post subject: Re: Division durch Null Reply with quote

Hallo,

Gregor Lehninger schrieb:
Quote:
ich habe ein problem mit der division durch 0. als eingefleischter
pascal programmierer habe ich erwartet, dass eine exception auftritt
die mich waehrend der programmentwicklung auf solche fehler hinweist.
[...]
am besten waere es, wenn das programm bei einer gleitkommadivision
durch 0 einfach abbrechen wuerde.

bei Einschränkung auf x86-Architektur ist die C-Funktion _control87 dein
Freund. Damit kann eine FPU-Exception erzwungen werden.

Eine standardkonforme, portable Lösung erfordert ein if(...).


Marcel
Back to top
Stefan Reuther
Guest





PostPosted: Thu May 10, 2007 9:23 pm    Post subject: Re: Division durch Null Reply with quote

Hallo,

Gregor Lehninger wrote:

Mal nur den nicht-Win32-Teil:

Quote:
#ifndef _WIN32
#include <unistd.h
#include <fcntl.h
#include <fenv.h
#endif

feclearexcept( FE_ALL_EXCEPT );
if(v) {
feenableexcept( FE_DIVBYZERO | FE_OVERFLOW | FE_INVALID );
} else {
fedisableexcept( FE_ALL_EXCEPT );
}

Das ist C99 (und die Header <unistd.h> und <fcntl.h> braucht man dazu
nicht). Allerdings würde ich nicht davon ausgehen, dass es diese
Funktionen wirklich überall gibt, da sie nicht Teil der aktuellen
Definition von C++ und auch nicht Teil der bis 1999 gültigen und immer
noch verbreiteten Definition von C.

Zum Entwickeln wird's taugen, aber falls portabler Produktivcode hinten
rausfallen soll, würde ich mir schon Gedanken machen, wie ich Division
durch 0 und Überläufe behandle.

Insbesondere sowas wie dass "1.0 / 0.0" als Integer 0 ergibt, und das
auch noch beabsichtigt ist, würde mich als Leser des Codes sehr
verwundern. Bei double->int-Casts, wo sowas auftreten kann, gehört
einfach ein Test drumherum. Da kannst du dann auch gleich noch eine
hübsche C++-Exception drausmachen, nicht nur eine Prozessorexception
(=Signal).


Stefan
Back to top
Gregor Lehninger
Guest





PostPosted: Fri May 11, 2007 2:33 am    Post subject: Re: Division durch Null Reply with quote

danke fuer die antworten



die funktion _controlfp hat mein problem geloest, weil ich damit die 2

stellen rausfinden konnte bei denen div/0 aufgetreten ist.



dass "1.0 / 0.0" als Integer 0 ergibt, war nicht beabsichtigt, es war

nur zufaelliger weise in meinem fall der richtige index in den vector.



portabel braucht der code auch nicht sein, nur von meinem x86+windows

auf einen anderen x86+windows und da hatte ich solche probleme nicht

vermutet...
Back to top
Elcaro Nosille
Guest





PostPosted: Sat May 12, 2007 3:00 am    Post subject: Re: Division durch Null Reply with quote

Gregor Lehninger schrieb:

Quote:
portabel braucht der code auch nicht sein, nur von meinem x86+windows
auf einen anderen x86+windows und da hatte ich solche probleme nicht

Auf x86-Windows hast Du noch die Möglichkeit, die FP-Exception als SEH
-Exception auszulösen und in eine C++-Exception zu verwandeln; ist sehr
komfortabel. AFAIK musst Du mit SetUnhandledExceptionFilter einen Filter
für die Exception bauen und von dort aus dann die C++-Exception werfen
die Du auf die Division durch Null dann werfen willst.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.