Turbo C CONTROL87








  PRODUCT  :  TURBO C                                NUMBER  :  399
  VERSION  :  1.0
       OS  :  PC-DOS
     DATE  :  January 6, 1988                          PAGE  :  1/4

    TITLE  :  CONTROL87




  The  following function was not documented in  the  Turbo  C  1.0
  manuals:

  _control87 - manipulates floating-point control word

  Usage           unsigned int  _control87(unsigned int newvals,
                          unsigned int mask);

  Prototype in    float.h

  Description     This function is used to retrieve or change the
                          floating-point control word.

  The floating-point control word is an unsigned int  that,  bit by
  bit, specifies  certain  modes  in  the  floating-point  package;
  namely, the precision, infinity  and  rounding  modes.   Changing
  these  modes  allows  you  to  mask   or   unmask  floating-point
  exceptions.

  _control87 matches the bits in mask to the bits in newvals.  If a
  mask bit = 1,  the  corresponding bit in newvals contains the new
  value  for  the  same bit in the floating-point control word, and
  _control87 sets that bit in the control word to the new value.

  Here's a simple illustration of how this works:

                  Original control word: 0100 0011 0110 0011

                                mask     1000 0001 0100 1111
                                newvals  1110 1001 0000 0101

                          Changing bits  1--- ---1 -0-- 0101

  If mask =  0,  _control87 returns the floating-point control word
  without altering it.

  Return value    The bits in the value returned reflect the new
                  floating-point control word.  For a complete
                  definition of the bits returned by _control87,
                  see float.h.

  /*--------------------------------------------------------------
   * floatrap.c













  PRODUCT  :  TURBO C                                NUMBER  :  399
  VERSION  :  1.0
       OS  :  PC-DOS
     DATE  :  January 6, 1988                          PAGE  :  2/4

    TITLE  :  CONTROL87




   *------------------------------------------------------------*/























































  PRODUCT  :  TURBO C                                NUMBER  :  399
  VERSION  :  1.0
       OS  :  PC-DOS
     DATE  :  January 6, 1988                          PAGE  :  3/4

    TITLE  :  CONTROL87




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


  /*   8087 control word mask  */

  #define CWNEW (RC_NEAR+PC_64+EM_DENORMAL+ \
                 EM_UNDERFLOW+EM_OVERFLOW+EM_ZERODIVIDE+EM_INEXACT)

  #define MASKALL 0xFFFF

  /*--------------------------------------------------------------
   * main
   *------------------------------------------------------------*/
  main() {
    double ans,ref,f;

    _control87(CWNEW,MASKALL);


    puts("/* an underflow */");
    ref = 2.0e-200;
    f = 2.0e200;
    ans = ref/f;
    printf("ref: %le\nnum: %le\nans: %le\n",ref,f,ans);

    puts("/* an overflow */");
    ref = 2.0e200;
    f = 2.0e200;
    ans = ref*f;
    printf("ref: %le\nnum: %le\nans: %le\n",ref,f,ans);

    puts("/* a division by zero */");
    ref = 2.0;
    f = 0.0;
    ans = ref/f;
    printf("ref: %le\nnum: %le\nans: %le\n",ref,f,ans);

  }

















  PRODUCT  :  TURBO C                                NUMBER  :  399
  VERSION  :  1.0
       OS  :  PC-DOS
     DATE  :  January 6, 1988                          PAGE  :  4/4

    TITLE  :  CONTROL87




  DISCLAIMER: You  have the right to use this technical information
  subject to the terms  of  the  No-Nonsense License Statement that
  you received with  the  Borland product to which this information
  pertains.













































Comments