Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Operating System

Handling FP errors

Linux
Solaris 10
Mac OS X 10.5
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="567747964cb11229-35874b3d-44294bf5-9fb0875f-143dce28cb9351a78beb8900"><ac:plain-text-body><![CDATA[Fedora Core 5

C99 FP functions - These functions are declared in fenv.h [2]
]]></ac:plain-text-body></ac:structured-macro>
Before fenv.h based functions were standardized; an alternative to using these C99/fenv function is using ieee_flags and ieee_handler  

<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]
]]></ac:plain-text-body></ac:structured-macro>
 

...

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)
{
&nbsp;&nbsp;&nbsp; 	// ...

&nbsp;&nbsp;&nbsp; 	switch(ieee->RoundingMode)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case \_FpRoundNearest:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		case _FpRoundNearest:
			// ....
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /		\* Other RMs include \_FpRoundMinusInfinity, \_FpRoundPlusInfinity, \_FpRoundChopped \*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 			// ....
&nbsp;&nbsp;&nbsp; 	}

&nbsp;&nbsp;&nbsp; 	switch(ieee->Precision)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case \_FpPrecision24:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		case _FpPrecision24:
		// ....
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\		/* Other Ps include \_FpPrecision53*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		// ....
&nbsp;&nbsp; 	}

&nbsp;&nbsp; 	switch(ieee->Operation)
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		case \_FpCodeAdd:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ...
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\* Other Ops include \_FpCodeSubtract, \_FpCodeMultiply, \_FpCodeDivide, \_FpCodeSquareRoot, \_FpCodeCompare, \_FpCodeConvert, \_FpCodeConvertTrunc \*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ....

&nbsp;&nbsp; }

&nbsp;&nbsp; // process the bitmap ieee->Cause
&nbsp;&nbsp; // process the bitmap ieee->Enable
&nbsp;&nbsp; // process the bitmap ieee->Status
&nbsp;&nbsp; // process the Operand ieee->Operand1, evaluate format and Value
&nbsp;&nbsp; // process the Operand ieee->Operand2, evaluate format and Value
&nbsp;&nbsp; // process the Result ieee->Result, evaluate format and Value
&nbsp;&nbsp; // the result should be set according to the operation specified in ieee->Cause and the result format as specified in ieee->Result
&nbsp;&nbsp; // the Result set is based on the
&nbsp;&nbsp; ...
}

...