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="ac2840f0b00445fb-b85b20dd-4e524ee2-a275bb36-3ecb758272845ce5cef99ae2"><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="c8c05a48efb13295-f1f46be4-44254ceb-b94786a7-714d2399633d2d4bcd0aec36"><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)
{
	// ...

	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:
&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;	// ...
}

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.

...