...
Operating System | Handling FP errors | ||
---|---|---|---|
Linux | C99 FP functions - These functions are declared in | AA. C References#Open Group 04]] | |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="2a0d78ebdce3735c-411b6339-434e4f56-8ae28a4b-3279d797710cd435d813f659"><ac:plain-text-body><![CDATA[ | Windows | Structured Exception Handling - user defined handler | AA. C References#MSDN]] |
...
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 */ /* ... */ } |
...