home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / c_all592.arj / TI399.ASC < prev    next >
Text File  |  1992-02-25  |  3KB  |  199 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.   PRODUCT  :  TURBO C                                NUMBER  :  399
  9.   VERSION  :  1.0
  10.        OS  :  PC-DOS
  11.      DATE  :  January 6, 1988                          PAGE  :  1/2
  12.  
  13.     TITLE  :  CONTROL87
  14.  
  15.  
  16.  
  17.  
  18.   The  following function was not documented in  the  Turbo  C  1.0
  19.   manuals:
  20.  
  21.   _control87 - manipulates floating-point control word
  22.  
  23.   Usage           unsigned int  _control87(unsigned int newvals,
  24.                           unsigned int mask);
  25.  
  26.   Prototype in    float.h
  27.  
  28.   Description     This function is used to retrieve or change the
  29.                           floating-point control word.
  30.  
  31.   The floating-point control word is an unsigned int  that,  bit by
  32.   bit, specifies  certain  modes  in  the  floating-point  package;
  33.   namely, the precision, infinity  and  rounding  modes.   Changing
  34.   these  modes  allows  you  to  mask   or   unmask  floating-point
  35.   exceptions.
  36.  
  37.   _control87 matches the bits in mask to the bits in newvals.  If a
  38.   mask bit = 1,  the  corresponding bit in newvals contains the new
  39.   value  for  the  same bit in the floating-point control word, and
  40.   _control87 sets that bit in the control word to the new value.
  41.  
  42.   Here's a simple illustration of how this works:
  43.  
  44.                   Original control word: 0100 0011 0110 0011
  45.  
  46.                                 mask     1000 0001 0100 1111
  47.                                 newvals  1110 1001 0000 0101
  48.  
  49.                           Changing bits  1--- ---1 -0-- 0101
  50.  
  51.   If mask =  0,  _control87 returns the floating-point control word
  52.   without altering it.
  53.  
  54.   Return value    The bits in the value returned reflect the new
  55.                   floating-point control word.  For a complete
  56.                   definition of the bits returned by _control87,
  57.                   see float.h.
  58.  
  59.   /*--------------------------------------------------------------
  60.    * floatrap.c
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.   PRODUCT  :  TURBO C                                NUMBER  :  399
  75.   VERSION  :  1.0
  76.        OS  :  PC-DOS
  77.      DATE  :  January 6, 1988                          PAGE  :  2/2
  78.  
  79.     TITLE  :  CONTROL87
  80.  
  81.  
  82.  
  83.  
  84.    *------------------------------------------------------------*/
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.   PRODUCT  :  TURBO C                                NUMBER  :  399
  141.   VERSION  :  1.0
  142.        OS  :  PC-DOS
  143.      DATE  :  January 6, 1988                          PAGE  :  3/2
  144.  
  145.     TITLE  :  CONTROL87
  146.  
  147.  
  148.  
  149.  
  150.   #include <stdio.h>
  151.   #include <float.h>
  152.  
  153.  
  154.   /*   8087 control word mask  */
  155.  
  156.   #define CWNEW (RC_NEAR+PC_64+EM_DENORMAL+ \
  157.                  EM_UNDERFLOW+EM_OVERFLOW+EM_ZERODIVIDE+EM_INEXACT)
  158.  
  159.   #define MASKALL 0xFFFF
  160.  
  161.   /*--------------------------------------------------------------
  162.    * main
  163.    *------------------------------------------------------------*/
  164.   main() {
  165.     double ans,ref,f;
  166.  
  167.     _control87(CWNEW,MASKALL);
  168.  
  169.  
  170.     puts("/* an underflow */");
  171.     ref = 2.0e-200;
  172.     f = 2.0e200;
  173.     ans = ref/f;
  174.     printf("ref: %le\nnum: %le\nans: %le\n",ref,f,ans);
  175.  
  176.     puts("/* an overflow */");
  177.     ref = 2.0e200;
  178.     f = 2.0e200;
  179.     ans = ref*f;
  180.     printf("ref: %le\nnum: %le\nans: %le\n",ref,f,ans);
  181.  
  182.     puts("/* a division by zero */");
  183.     ref = 2.0;
  184.     f = 0.0;
  185.     ans = ref/f;
  186.     printf("ref: %le\nnum: %le\nans: %le\n",ref,f,ans);
  187.  
  188.   }
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.