Result of _fpreset() Is Not _CW_DEFAULT (119458)
The information in this article applies to:
- The C Run-Time (CRT), when used with:
- Microsoft Visual C++, 32-bit Professional Edition 2.0
- Microsoft Visual C++, 32-bit Professional Edition 2.1
This article was previously published under Q119458 SUMMARY
Calling _fpreset() reinitializes the floating-point math package. The
header file FLOAT.H contains the following definition of _CW_DEFAULT:
/* initial Control Word value */
#ifdef _M_IX86
#define _CW_DEFAULT ( _RC_NEAR + _PC_64 + _EM_INVALID + _EM_ZERODIVIDE +
_EM_OVERFLOW + _EM_UNDERFLOW + _EM_INEXACT )
#endif
You might expect that if you call _fpreset() and then call _controlfp(0,0)
to get the control word, that the control word will be _CW_DEFAULT;
however, that is not the case. _CW_DEFAULT does not actually correspond to
the default value of the x87 control word. The difference is that
_CW_DEFAULT does not mask the denormal exception. The _fpreset() routine
masks all exceptions, including denormal.
The denormal exception does not belong to the set of floating-point
exceptions specified by the IEEE Standard. You cannot mask or unmask the
exception using _controlfp(). The abstract control word used by the C run-
time reserves the upper bits for machine-specific features. Therefore, you
should not compare full control-word encodings; instead, you should compare
the bits that you are interested in.
Modification Type: | Major | Last Reviewed: | 12/1/2003 |
---|
Keywords: | kbCRT KB119458 |
---|
|