...
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="c8c05a48efb13295-f1f46be4-44254ceb-b94786a7-714d2399633d2d4bcd0aec36"><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 // ... } |
Risk Assessment
The Floating point exceptions if they go undetected will cause one or more of these conditions - security vulnerability, lower program efficiency and generate inaccurate results. Most processors stall for significant duration (sometimes upto a second or even more on 32bit desktop processors) when an operation incur a NaN.
...