...
Operating System | Handling FP errors | |
---|---|---|
Linux | C99 FP functions - These functions are declared in fenv.h [2] | |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="202c4496ae778f86-880895c9-4dd74200-8422aa59-6344528962bc6ec91ae3bc5c"><ac:plain-text-body><![CDATA[ | Windows | Structured Exception Handling - user defined handler _fpieee_flt [3] |
...
Code Block |
---|
fp_usingSEH() { /* ... */ double a = 1e-40, b, c = 0.1; float x = 0, y; unsigned int rv ; unmask_fp(); _try { // Store into y is inexact and underflows: y = a; // divide by zero operation b = y / x; // inexact c = sin(30) * a; } _except (_fpieee_flt (GetExceptionCode(), GetExceptionInformation(), fpieee_handler)) { printf ("fpieee_handler: EXCEPTION_EXECUTE_HANDLER"); } ... } void unmask_fpsr(void) { unsigned int u; unsigned int control_word; \ _controlfp_s(&control_word, 0, 0); u = control_word & \~(_EM_INVALID \| \_EM_DENORMAL \| \_EM_ZERODIVIDE \| \_EM_OVERFLOW \| \_EM_UNDERFLOW \| \_EM_INEXACT); \ _controlfp_s( &control_word, u, \_MCW_EM); return ; } int fpieee_handler (_FPIEEE_RECORD \*ieee) { // ... switch(ieee->RoundingMode) { case \_FpRoundNearest: // .... break; /\* Other RMs include \_FpRoundMinusInfinity, \_FpRoundPlusInfinity, \_FpRoundChopped \*/ // .... } switch(ieee->Precision) { case \_FpPrecision24: // .... break; /\* Other Ps include \_FpPrecision53*/ // .... } switch(ieee->Operation) { case \_FpCodeAdd: // ... break; /\* Other Ops include \_FpCodeSubtract, \_FpCodeMultiply, \_FpCodeDivide, \_FpCodeSquareRoot, \_FpCodeCompare, \_FpCodeConvert, \_FpCodeConvertTrunc \*/ // .... } // process the bitmap ieee->Cause // process the bitmap ieee->Enable // process the bitmap ieee->Status // process the Operand ieee->Operand1, evaluate format and Value // process the Operand ieee->Operand2, evaluate format and Value // process the Result ieee->Result, evaluate format and Value // the result should be set according to the operation specified in ieee->Cause and the result format as specified in ieee->Result // the Result set is based on the ... } |
...