Category : C Source Code
Archive   : C-ALL.ZIP
Filename : TI399.ASC

 
Output of file : TI399.ASC contained in archive : C-ALL.ZIP







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

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/2

TITLE : CONTROL87




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























































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

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);

}












  3 Responses to “Category : C Source Code
Archive   : C-ALL.ZIP
Filename : TI399.ASC

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/