home *** CD-ROM | disk | FTP | other *** search
/ Game Zone - 1,000+ Games / GAMEZONE.BIN / Programs / PALM / Oh-One / src / s_tan.c < prev    next >
C/C++ Source or Header  |  1996-10-05  |  2KB  |  82 lines

  1. /* @(#)s_tan.c 5.1 93/09/24 */
  2. /*
  3.  * ====================================================
  4.  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  5.  *
  6.  * Developed at SunPro, a Sun Microsystems, Inc. business.
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software is freely granted, provided that this notice
  9.  * is preserved.
  10.  * ====================================================
  11.  */
  12.  
  13. #if defined(LIBM_SCCS) && !defined(lint)
  14. static char rcsid[] = "$NetBSD: s_tan.c,v 1.7 1995/05/10 20:48:18 jtc Exp $";
  15. #endif
  16.  
  17. /* tan(x)
  18.  * Return tangent function of x.
  19.  *
  20.  * kernel function:
  21.  *    __kernel_tan        ... tangent function on [-pi/4,pi/4]
  22.  *    __ieee754_rem_pio2    ... argument reduction routine
  23.  *
  24.  * Method.
  25.  *      Let S,C and T denote the sin, cos and tan respectively on
  26.  *    [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
  27.  *    in [-pi/4 , +pi/4], and let n = k mod 4.
  28.  *    We have
  29.  *
  30.  *          n        sin(x)      cos(x)        tan(x)
  31.  *     ----------------------------------------------------------
  32.  *        0           S       C         T
  33.  *        1           C      -S        -1/T
  34.  *        2          -S      -C         T
  35.  *        3          -C       S        -1/T
  36.  *     ----------------------------------------------------------
  37.  *
  38.  * Special cases:
  39.  *      Let trig be any of sin, cos, or tan.
  40.  *      trig(+-INF)  is NaN, with signals;
  41.  *      trig(NaN)    is that NaN;
  42.  *
  43.  * Accuracy:
  44.  *    TRIG(x) returns trig(x) nearly rounded
  45.  */
  46.  
  47. #include "math.h"
  48. #include "math_private.h"
  49.  
  50. #ifdef __STDC__
  51.     double __tan(double x)
  52. #else
  53.     double __tan(x)
  54.     double x;
  55. #endif
  56. {
  57.     double y[2],z=0.0;
  58.     int32_t n, ix;
  59.  
  60.     /* High word of x. */
  61.     GET_HIGH_WORD(ix,x);
  62.  
  63.     /* |x| ~< pi/4 */
  64.     ix &= 0x7fffffff;
  65.     if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1);
  66.  
  67.     /* tan(Inf or NaN) is NaN */
  68.     else if (ix>=0x7ff00000) return x-x;        /* NaN */
  69.  
  70.     /* argument reduction needed */
  71.     else {
  72.         n = __ieee754_rem_pio2(x,y);
  73.         return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even
  74.                             -1 -- n odd */
  75.     }
  76. }
  77. weak_alias (__tan, tan)
  78. #ifdef NO_LONG_DOUBLE
  79. strong_alias (__tan, __tanl)
  80. weak_alias (__tan, tanl)
  81. #endif
  82.