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 #include /* 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.