I'd like to play with those traps for educational purpose.
A common problem with the default behavior in numerical calculus is that we "miss" the Nan (or +-inf) that appeared in a wrong operation. Default behavior is propagation through the computation, but some operation (like comparisons) break the chain and loose the Nan, and the rest of the treatment continue without acknowledging the singularity in previous steps of the algorithm.
Sometimes we have ways to react to this kind of event : prolongating a function ("0/0 = 12 in my case"), or in time-domain simulation throwing the step away and trying with other settings (like the predictor, the step size or whatever).
So here is my question : do you know languages that expose the IEEE754 traps to the developer ? I don't feel like messing with ASM for that.
As far as I know, you have two choices for floating point exception handling in C and C++:
First, if you disable/mask floating point exceptions (which most environments do by default), you can see whether any floating point exceptions have occurred by calling fetestexcept. fetestexcept isn't available in Visual C++, but you can steal the MinGW Runtime's implementation easily enough. (It's in the public domain.) Once an exception has been flagged, it's not cleared until you call feclearexcept, so you can call fetestexcept at the end of a series of calculations to see if any of them raised an exception. This doesn't give you the traps that you asked for, but it does let you test if problems like NaN or +/-inf have occurred and react as needed.
Second, you can enable/unmask floating point exceptions by calling feenableexcept in Linux or _controlfp in Windows. How the operating system handles a processor-generated floating point exception depends on your operating system.
__try
/ __catch
block in C or try
/ catch
block in C++._MM_SET_EXCEPTION_MASK
from xmmintrin.h
, and as long as you use the default compiler options (i.e., don't disable SSE), you should be able to catch exceptions using SIGFPE. (I've written a bit more on this and other floating point issues in C and C++ in this blog posting if you're curious.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With