### _clear87 -- Clear Floating-Point Status Word

Format

>     #include <float.h>  /* also in <builtin.h> */
>     unsigned int _clear87(void);

Language Level: Extension
_clear87 gets the floating-point status word and then clears it. The floating-point status word is a combination of the numeric coprocessor status word and other conditions that the numeric exception handler detects, such as floating-point stack overflow and underflow.

_clear87 affects only the current thread. It does not affect any other threads that may be processing.

Return Value
The bits in the value returned reflect the floating-point status before the call to _clear87 was made.

Example
This example takes a number close to 0 as a double and assigns it to a float. The result is a loss of significance, y becomes a denormal number, and the underflow bit of the floating-point status word is set. _clear87 gets the current floating-point status word and then clears it, and printf prints it as immediate data. The result shows the change in the floating-point word because of the loss of significance.

The program then assigns the denormal y to another variable, causing the denormal bit to be set in the floating-point status word. Again, _clear87 gets the current status word and clears it, and printf prints it to the screen.

    #include <stdio.h>
    #include <float.h>

    double a = 1e-40;
    double b;
    float y;

    int main(void)
    {
       unsigned int statword;
       unsigned int old_cw;

       /*  change control word to mask all exceptions                           */

       _control87(0x037f, 0xffff);

       /* Assignment of the double to the float y is inexact;                   */
       /* the underflow bit is set.                                             */

       y = a;
       statword = _clear87();
       printf("floating-point status = 0x%.4x after underflow\n", statword);
       statword = _status87();
       printf("cleared floating-point status word = 0x%.4x\n", statword);

       /*  reset floating point status word                                     */

       _fpreset();

       /*  change control word to mask all exception                            */

       _control87(0x037f, 0xffff);

       /* Reassigning the denormal y to the double b                            */
       /*   causes the denormal bit to be set.                                  */

       b = y;
       statword = _clear87();
       printf("floating-point status = 0x%.4x for denormal\n", statword);

       /*  reset floating point status word                                     */

       _fpreset();
       return 0;

       /*************************************************************************
          The output should be:

          floating-point status = 0x0030 after underflow
          cleared floating-point status word = 0x0000
          floating-point status = 0x0002 for denormal
       *************************************************************************/
    }

_control87 -- Set Floating-Point Control Word
_status87 -- Get Floating-Point Status Word
_fpreset -- Reset Floating-Point Unit
<float.h>