...
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="ef237dc244d315d5-93d7120a-41ec4986-88cfa240-83036038da2627f6ba66a21b"><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
...
}
|
...