 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Gregor Lehninger Guest
|
Posted: Wed May 09, 2007 12:29 am Post subject: Division durch Null |
|
|
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
|
Posted: Thu May 10, 2007 1:29 am Post subject: Re: Division durch Null |
|
|
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
|
Posted: Thu May 10, 2007 2:09 am Post subject: Re: Division durch Null |
|
|
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
|
Posted: Thu May 10, 2007 2:10 am Post subject: Re: Division durch Null |
|
|
| 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
|
Posted: Thu May 10, 2007 3:04 am Post subject: Re: Division durch Null |
|
|
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
|
Posted: Thu May 10, 2007 1:16 pm Post subject: Re: Division durch Null |
|
|
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
|
Posted: Thu May 10, 2007 9:23 pm Post subject: Re: Division durch Null |
|
|
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
|
Posted: Fri May 11, 2007 2:33 am Post subject: Re: Division durch Null |
|
|
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
|
Posted: Sat May 12, 2007 3:00 am Post subject: Re: Division durch Null |
|
|
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 |
|
 |
|
|
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
|
|