Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1.  
  2. /* @(#)s_tan.c 5.1 93/09/24 */
  3. /*
  4.  * ====================================================
  5.  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  6.  *
  7.  * Developed at SunPro, a Sun Microsystems, Inc. business.
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software is freely granted, provided that this notice
  10.  * is preserved.
  11.  * ====================================================
  12.  */
  13.  
  14.  
  15. /*
  16.  
  17. FUNCTION
  18.         <<tan>>, <<tanf>>---tangent
  19.  
  20. INDEX
  21. tan
  22. INDEX
  23. tanf
  24.  
  25. ANSI_SYNOPSIS
  26.         #include <math.h>
  27.         double tan(double <[x]>);
  28.         float tanf(float <[x]>);
  29.  
  30. TRAD_SYNOPSIS
  31.         #include <math.h>
  32.         double tan(<[x]>)
  33.         double <[x]>;
  34.  
  35.         float tanf(<[x]>)
  36.         float <[x]>;
  37.  
  38.  
  39. DESCRIPTION
  40. <<tan>> computes the tangent of the argument <[x]>.  
  41. Angles are specified in radians.  
  42.  
  43. <<tanf>> is identical, save that it takes and returns <<float>> values.
  44.  
  45. RETURNS
  46. The tangent of <[x]> is returned.
  47.  
  48. PORTABILITY
  49. <<tan>> is ANSI. <<tanf>> is an extension.
  50. */
  51.  
  52. /* tan(x)
  53.  * Return tangent function of x.
  54.  *
  55.  * kernel function:
  56.  *      __kernel_tan            ... tangent function on [-pi/4,pi/4]
  57.  *      __ieee754_rem_pio2      ... argument reduction routine
  58.  *
  59.  * Method.
  60.  *      Let S,C and T denote the sin, cos and tan respectively on
  61.  *      [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
  62.  *      in [-pi/4 , +pi/4], and let n = k mod 4.
  63.  *      We have
  64.  *
  65.  *          n        sin(x)      cos(x)        tan(x)
  66.  *     ----------------------------------------------------------
  67.  *          0          S           C             T
  68.  *          1          C          -S            -1/T
  69.  *          2         -S          -C             T
  70.  *          3         -C           S            -1/T
  71.  *     ----------------------------------------------------------
  72.  *
  73.  * Special cases:
  74.  *      Let trig be any of sin, cos, or tan.
  75.  *      trig(+-INF)  is NaN, with signals;
  76.  *      trig(NaN)    is that NaN;
  77.  *
  78.  * Accuracy:
  79.  *      TRIG(x) returns trig(x) nearly rounded
  80.  */
  81.  
  82. #include "fdlibm.h"
  83.  
  84. #ifndef _DOUBLE_IS_32BITS
  85.  
  86. #ifdef __STDC__
  87.         double tan(double x)
  88. #else
  89.         double tan(x)
  90.         double x;
  91. #endif
  92. {
  93.         double y[2],z=0.0;
  94.         __int32_t n,ix;
  95.  
  96.     /* High word of x. */
  97.         GET_HIGH_WORD(ix,x);
  98.  
  99.     /* |x| ~< pi/4 */
  100.         ix &= 0x7fffffff;
  101.         if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1);
  102.  
  103.     /* tan(Inf or NaN) is NaN */
  104.         else if (ix>=0x7ff00000) return x-x;            /* NaN */
  105.  
  106.     /* argument reduction needed */
  107.         else {
  108.             n = __ieee754_rem_pio2(x,y);
  109.             return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even
  110.                                                         -1 -- n odd */
  111.         }
  112. }
  113.  
  114. #endif /* _DOUBLE_IS_32BITS */
  115.