Microsoft KB Archive/72726

{|
 * width="100%"|

signal with SIGFPE Requires Floating-Point Support

 * }

Q72726

-

The information in this article applies to:


 * The C Run-Time (CRT), included with:
 * Microsoft C for MS-DOS, versions 5.0, 5.1, 6.0, 6.0a, and 6.0ax
 * Microsoft C for OS/2, versions 5.1, 6.0, and 6.0a
 * Microsoft C/C++ for MS-DOS, version 7.0
 * Microsoft Visual C++, versions 1.0, 1.5, 1.51, 1.52

-

SUMMARY
The signal function may be used to trap floating-point errors that would normally be fatal for an application. To trap these exceptions, the floating-point library must be linked in and become a part of the .EXE. One way that this can be done is by defining a double and initializing it to &quot;0.0f&quot; in your code.

If floating-point support has not been linked in for some reason and you try to set up a signal handler for SIGFPE (floating-point error), signal will return SIG_ERR.

MORE INFORMATION
The types of floating-point exceptions that you can trap with the signal function include the following:

 FPE_INVALID:       Invalid number. This exception covers all cases not covered by other exceptions [inputs that are not a number (NaN), infinite, out-of-range, or in an unsupported format].  FPE_DENORMAL:      Denormal number used. A denormal is defined as                   a number that has a biased exponent of zero. By providing a significand with leading zeros, the range of possible negative exponents can be extended by the number of bits in the significand. Each leading zero is a bit of                   lost accuracy, so the extended exponent range is obtained by reducing significance.  FPE_ZERODIVIDE:    Divide by zero, or an answer where the exponent has an infinite magnitude.  FPE_OVERFLOW:      Overflow. The magnitude of the result, while finite, is too large to be represented in the format requested.  FPE_UNDERFLOW:     Underflow. Just the opposite. The magnitude of                   the result is too small to be represented in                    the format requested. A denormal may be                   generated at a loss of precision.  <pre class="FIXEDTEXT">FPE_INEXACT:       Inexact result (precision exception). Usually masked and ignored. Generated when the result is not exact. </li> <pre class="FIXEDTEXT">FPE_UNEMULATED:    Function not emulated in library. </li> <pre class="FIXEDTEXT">FPE_SQRTNEG:       Negative square root. Generated when the sqrt or sqrtl function returns a negative number. </li> <pre class="FIXEDTEXT">FPE_STACKOVERFLOW: Floating-point stack overflow. </li> <pre class="FIXEDTEXT">FPE_STACKUNDERFLOW: Floating-point stack underflow. </li> <pre class="FIXEDTEXT">FPE_EXPLICITGEN:   Explicit call. This exception is generated when the raise function is used to generate a floating-point exception. </li></ul>

The following sample code attempts to set up a signal handler for SIGFPE without indicating that the floating-point code should be linked in, resulting in the return of SIG_ERR to signal. Removing the comment corrects the problem.

Sample Code
<pre class="CODESAMP">/* Compile options used:


 * 1) include <stdio.h>
 * 2) include <signal.h>
 * 3) include <float.h>
 * 4) include <math.h>

void func1(int, int);

void main(void) { //  double d = 0.0f;                    // Uncomment for workaround if(signal(SIGFPE, func1)==SIG_ERR) printf(&quot;signal Failed\n&quot;); }

void func1(int i, int j) { } Additional query words: kbinf 6.00 6.00a 6.00ax 5.00 5.10 7.00 1.00 1.50

Keywords : kb16bitonly

Issue type :

Technology : kbVCsearch kbAudDeveloper kbCRT