INFO: Trapping Floating-Point Exceptions in a Win32-based App
ID: Q94998
|
The information in this article applies to:
-
Microsoft Win32 Application Programming Interface (API), used with:
-
Microsoft Windows NT versions 3.1, 3.5, 3.51
-
Microsoft Windows versions 95, 98
-
Microsoft Windows 2000
SUMMARY
The _controlfp() function is the portable equivalent to the _control87()
function.
To trap floating-point (FP) exceptions via try-except (such as
EXCEPTION_FLT_OVERFLOW), insert the following before doing FP operations:
// Get the default control word.
int cw = _controlfp( 0,0 );
// Set the exception masks OFF, turn exceptions on.
cw &=~(EM_OVERFLOW|EM_UNDERFLOW|EM_INEXACT|EM_ZERODIVIDE|EM_DENORMAL);
// Set the control word.
_controlfp( cw, MCW_EM );
This turns on all possible FP exceptions. To trap only particular
exceptions, choose only the flags that pertain to the exceptions desired.
Note that any handler for FP errors should have _clearfp() as its first FP
instruction.
MORE INFORMATION
By default, Windows NT has all the FP exceptions turned off, and thus
computations result in NAN or INFINITY rather than an exception. Note,
however, that if an exception occurs and an explicit handler does not exist
for it, the default exception handler will terminate the process.
If you want to determine which mask bits are set and which are not during
exception handling, you need to use _clearfp() to clear the floating-point
exception. This routine returns the existing FP status word, giving the
necessary information about the exception. After this, it is safe to query
the chip for the state of its control word with _controlfp(). However, as
long as an unmasked FP exception is active, most FP instructions will
fault, including the fstcw in _controlfp().
Additional query words:
3.10 3.50 4.00
Keywords : kbKernBase kbNTOS310 kbNTOS350 kbNTOS351 kbWinOS2000 kbExceptHandSEH kbWinOS95 kbWinOS98 kbDSupport kbGrpKernBase
Version : winnt:3.1,3.5,3.51
Platform : winnt
Issue type : kbinfo