...
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="11be7c3ffa258994-d0483dd5-45754b86-bebebc12-c82dc7f5890fc071d7acf614"><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: case _FpRoundNearest: // .... break; / \* Other RMs include \_FpRoundMinusInfinity, \_FpRoundPlusInfinity, \_FpRoundChopped \*/ // .... } switch(ieee->Precision) { case \_FpPrecision24: 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 ... } |
...