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

  1. /* @(#)s_cos.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_cos.c,v 1.7 1995/05/10 20:47:02 jtc Exp $";
  15. #endif
  16.  
  17. /* cos(x)
  18.  * Return cosine function of x.
  19.  *
  20.  * kernel function:
  21.  *    __kernel_sin        ... sine function on [-pi/4,pi/4]
  22.  *    __kernel_cos        ... cosine function on [-pi/4,pi/4]
  23.  *    __ieee754_rem_pio2    ... argument reduction routine
  24.  *
  25.  * Method.
  26.  *      Let S,C and T denote the sin, cos and tan respectively on
  27.  *    [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
  28.  *    in [-pi/4 , +pi/4], and let n = k mod 4.
  29.  *    We have
  30.  *
  31.  *          n        sin(x)      cos(x)        tan(x)
  32.  *     ----------------------------------------------------------
  33.  *        0           S       C         T
  34.  *        1           C      -S        -1/T
  35.  *        2          -S      -C         T
  36.  *        3          -C       S        -1/T
  37.  *     ----------------------------------------------------------
  38.  *
  39.  * Special cases:
  40.  *      Let trig be any of sin, cos, or tan.
  41.  *      trig(+-INF)  is NaN, with signals;
  42.  *      trig(NaN)    is that NaN;
  43.  *
  44.  * Accuracy:
  45.  *    TRIG(x) returns trig(x) nearly rounded
  46.  */
  47.  
  48. #include "math.h"
  49. #include "math_private.h"
  50.  
  51. #ifdef __STDC__
  52.     double __cos(double x)
  53. #else
  54.     double __cos(x)
  55.     double x;
  56. #endif
  57. {
  58.     double y[2],z=0.0;
  59.     int32_t n, ix;
  60.  
  61.     /* High word of x. */
  62.     GET_HIGH_WORD(ix,x);
  63.  
  64.     /* |x| ~< pi/4 */
  65.     ix &= 0x7fffffff;
  66.     if(ix <= 0x3fe921fb) return __kernel_cos(x,z);
  67.  
  68.     /* cos(Inf or NaN) is NaN */
  69.     else if (ix>=0x7ff00000) return x-x;
  70.  
  71.     /* argument reduction needed */
  72.     else {
  73.         n = __ieee754_rem_pio2(x,y);
  74.         switch(n&3) {
  75.         case 0: return  __kernel_cos(y[0],y[1]);
  76.         case 1: return -__kernel_sin(y[0],y[1],1);
  77.         case 2: return -__kernel_cos(y[0],y[1]);
  78.         default:
  79.                 return  __kernel_sin(y[0],y[1],1);
  80.         }
  81.     }
  82. }
  83. weak_alias (__cos, cos)
  84. #ifdef NO_LONG_DOUBLE
  85. strong_alias (__cos, __cosl)
  86. weak_alias (__cos, cosl)
  87. #endif
  88.