Subversion Repositories Kolibri OS

Rev

Rev 4872 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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