home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------------------
- * filename - tanl.cas
- *
- * function(s)
- * tanl - long double trigonometric tangent function
- *-----------------------------------------------------------------------*/
-
- /*
- * C/C++ Run Time Library - Version 5.0
- *
- * Copyright (c) 1987, 1992 by Borland International
- * All Rights Reserved.
- *
- */
-
-
- #pragma inline
- #include <asmrules.h>
-
- #include <_math.h>
- #include <math.h>
- #include <errno.h>
- #include <stddef.h>
-
- static unsigned short NANTRIGL [5] = {0,0,0,0xC021, 0x7FFF};
-
- /*--------------------------------------------------------------------------*
-
- Name tanl - trigonometric tangent function
-
- Usage long double tanl(long double x);
-
- Prototype in math.h
-
- Description tanl returns the tangent of the input value. Angles are
- specified in radians.
-
- Return value tanl returns any value for valid angles. For angles close to
- pi/2 or -pi/2, tanl returns 0 and errno is set to
- ERANGE Result out of range
- For very large arguments (magnitude 2^63 or greater) all
- precision is lost. This occurs "silently" since the ANSI C
- spec does not specify an error return.
-
- *---------------------------------------------------------------------------*/
- #pragma warn -rvl
- long double _FARFUNC tanl (long double x)
- {
- asm FLD LONGDOUBLE (x)
-
- asm mov ax, 7FFFh
- asm and ax, W0 (x [8]) /* extract the exponent field */
- asm cmp ax, 63 + 3FFFh /* biased version of exponent 63 */
- asm jae tanl_tooLarge
-
- #ifdef _Windows
- _f87_Tangent();
- #else
- if (_8087 >= 3)
- {
- asm db OPCODE_FSINCOS
- asm FDIV
- }
- else
- {
- asm _FAST_ (_FTAN_)
- }
- #endif
-
- tanl_end:
- return;
-
-
- tanl_tooLarge: /* total loss of precision */
- asm FSTP ST(0) /* pop x from stack */
-
- #pragma warn -ret
- return __matherrl (TLOSS, "tanl", &x, NULL, *((long double *) NANTRIGL));
- #pragma warn .ret
- }
- #pragma warn .rvl
-