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="e0efbabff88c1bc8-20fc7d39-40f44077-b761bd7e-e2191abc57dda2b31b08e5c6"><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="202c4496ae778f86-880895c9-4dd74200-8422aa59-6344528962bc6ec91ae3bc5c"><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)
{
&nbsp;&nbsp;&nbsp;&nbsp;       	unsigned int u;
&nbsp;&nbsp;&nbsp;&nbsp;       	unsigned int control_word;
&nbsp;&nbsp;&nbsp;&nbsp; \	_controlfp_s(&control_word, 0, 0);
&nbsp;&nbsp;&nbsp;&nbsp; 	u = control_word & \~(_EM_INVALID \| \_EM_DENORMAL \| \_EM_ZERODIVIDE
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \| \_EM_OVERFLOW \| \_EM_UNDERFLOW \| \_EM_INEXACT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \	_controlfp_s( &control_word, u, \_MCW_EM);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 	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; // ....
&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; // ....
&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; ...
}

...