From: Andrew G. <And...@np...> - 2003-01-02 14:56:33
|
Can anyone offer advice on how to catch exceptions (MinGW 2.0.0, C++) arising from divide-by-zero, underflow or overflow in numeric code? I found this site - but it's a bit out of date and looks rather complicated. http://sources.redhat.com/ml/cygwin/1999-08/msg00362.html Andrew. ------------------------------------------------------------------- This e-mail and any attachments may contain confidential and/or privileged material; it is for the intended addressee(s) only. If you are not a named addressee, you must not use, retain or disclose such information. NPL Management Ltd cannot guarantee that the e-mail or any attachments are free from viruses. NPL Management Ltd. Registered in England and Wales. No: 2937881 Registered Office: Teddington, Middlesex, United Kingdom TW11 0LW. ------------------------------------------------------------------- |
From: Greg C. <chi...@mi...> - 2003-01-03 01:17:08
|
Andrew Gregory wrote: > > Can anyone offer advice on how to catch exceptions (MinGW 2.0.0, C++) > arising from divide-by-zero, underflow or overflow in numeric code? > > I found this site - but it's a bit out of date and looks rather > complicated. > > http://sources.redhat.com/ml/cygwin/1999-08/msg00362.html I didn't download it, but I've used other stuff Kenneth Haley wrote and I'd trust his work. He's demonstrating SEH, which is specific to windows. You can also use signal(). Here's a quick and ugly example. You can't necessarily do anything inside a signal handler except raise a semaphore, reset the signal handler, and return--or abort. See C99 standard 7.14.1.1/5 and footnote 158. #include <csignal> #include <cstdlib> #include <iostream> void fpe_handler(int) { std::cerr << "Floating point error.\n"; std::abort(); } void install_fpe_handler() { if(SIG_ERR == std::signal(SIGFPE, fpe_handler)) { std::cerr << "Cannot install signal handler.\n"; } } int main() { // Unmask some numeric exceptions asm volatile("fldcw %0" : : "m" (0x0340)); install_fpe_handler(); volatile double d0 = 0.0; volatile double d1 = 1.0; // divide by zero d1 = d1 / d0; } |
From: Luke D. <cod...@ho...> - 2003-01-03 01:47:58
|
----- Original Message ----- From: "Greg Chicares" <chi...@mi...> To: "Andrew Gregory" <And...@np...>; <min...@li...> Sent: Friday, January 03, 2003 9:17 AM Subject: Re: [Mingw-users] Catching exceptions > Andrew Gregory wrote: > > > > Can anyone offer advice on how to catch exceptions (MinGW 2.0.0, C++) > > arising from divide-by-zero, underflow or overflow in numeric code? > > > > I found this site - but it's a bit out of date and looks rather > > complicated. > > > > http://sources.redhat.com/ml/cygwin/1999-08/msg00362.html > > I didn't download it, but I've used other stuff > Kenneth Haley wrote and I'd trust his work. > He's demonstrating SEH, which is specific to > windows. > > You can also use signal(). Here's a quick and > ugly example. You can't necessarily do anything > inside a signal handler except raise a semaphore, > reset the signal handler, and return--or abort. > See C99 standard 7.14.1.1/5 and footnote 158. > > #include <csignal> > #include <cstdlib> > #include <iostream> > > void fpe_handler(int) > { > std::cerr << "Floating point error.\n"; FYI, the MSDN documentation says that you cannot use stdio because the signal handler might be called "when a run-time operation is incomplete and in an unknown state". I don't know if this is actually a problem for SIGFPE but the point is that MS doesn't guarantee that using stdio will work. > std::abort(); > } > > void install_fpe_handler() > { > if(SIG_ERR == std::signal(SIGFPE, fpe_handler)) > { > std::cerr << "Cannot install signal handler.\n"; > } > } > > int main() > { > // Unmask some numeric exceptions > asm volatile("fldcw %0" : : "m" (0x0340)); > > install_fpe_handler(); > > volatile double d0 = 0.0; > volatile double d1 = 1.0; > > // divide by zero > d1 = d1 / d0; > } > Luke Dunstan |
From: Luke D. <cod...@ho...> - 2003-01-03 01:41:09
|
I don't know about SEH but maybe signal(SIGFPE, ...) would work for your purposes? See the MSDN documentation because there seem to be a lot of restrictions. Luke Dunstan ----- Original Message ----- From: "Andrew Gregory" <And...@np...> To: <min...@li...> Sent: Thursday, January 02, 2003 10:56 PM Subject: [Mingw-users] Catching exceptions > Can anyone offer advice on how to catch exceptions (MinGW 2.0.0, C++) > arising from divide-by-zero, underflow or overflow in numeric code? > > I found this site - but it's a bit out of date and looks rather > complicated. > > > http://sources.redhat.com/ml/cygwin/1999-08/msg00362.html > > Andrew. > |