, . , _controlfp , . , , , , . .
DWORD _controlfp(DWORD new, DWORD mask)
(current_mask) :
(current_mask & ~mask) | (new & mask)
, new, mask. , mask, . FP- , , , , .
. , (current_mask), , . , mask 0xFFFFFFFF, new, , , .
, , , mask MCW_EM, . , FP- _clearfp.
#include <float.h>
DWORD FPOld, FPNew; /* . */
FPOld = _controlfp(0, 0); /* . */
/* . */
FPNew = FPOld & ~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_ZERODIVIDE | EM_DENORMAL | EM_INVALID);
/* . MCW_EM , . */
_controlfp(FPNew, MCW_EM);
while() __try { /* . */
/* FP-. */
} __except(EXCEPTION_EXECUTE_HANDLER) {
/* FP-. */
_clearfp(); /* . */
_controlfp(FPOld, 0xFFFFFFFF); /* . */
}
FP-, EXCEPTION_FLT_STACK_CHECK, . -, , EM_OVERFLOW. 4.3 .