www.pudn.com > system.rar > cos.c


/****************************************************************************/ 
/*  cos    v2.54                                                            */ 
/*  Copyright (c) 1995-2004 Texas Instruments Incorporated                  */ 
/****************************************************************************/ 
#include  
#include  
 
/****************************************************************************/ 
/*  COS() - Cosine							    */ 
/*									    */ 
/*  Based on the algorithm from "Software Manual for the Elementary         */ 
/*  Functions", Cody and Waite, Prentice Hall 1980, chapter 8.              */ 
/*									    */ 
/*  N = round(x / PI + 1/2) - 0.5					    */ 
/*  f = x - N * PI							    */ 
/*  g = f * f								    */ 
/*  R = polynomial expression						    */ 
/*									    */ 
/*  result = f + f * R							    */ 
/*  if N is even, result = - result					    */ 
/*									    */ 
/*  This will return the wrong result for x >= MAXINT * PI		    */ 
/****************************************************************************/ 
double cos(double x) 
{ 
    int sign;           /* the sign of the result */ 
    double xn, f, g, rg, result; 
    int n; 
 
    /**************************************************************************/ 
    /* cos(x) = cos(-x)                                                       */ 
    /**************************************************************************/ 
    x = fabs(x); 
 
    /**************************************************************************/ 
    /* n = round(x/PI + 1/2) (can be rounded this way, since positive number) */ 
    /**************************************************************************/ 
    n  = (int) (((x + HALFPI) * INVSPI) + 0.5); 
    xn = (double) n - 0.5; 
 
    /**************************************************************************/ 
    /* if n is odd, negate the sign                                           */ 
    /**************************************************************************/ 
    sign = n % 2; 
 
    /**************************************************************************/ 
    /* f = x - xn * PI (but more mathematically stable)                       */ 
    /**************************************************************************/ 
    f = (x - xn * C1) - xn * C2; 
 
    /**************************************************************************/ 
    /* determine polynomial expression                                        */ 
    /**************************************************************************/ 
    g = f * f; 
 
#if BITS<=24 
    rg = (((R4 * g + R3) * g + R2) * g + R1) * g; 
#elif BITS>=25 && BITS<=32 
    rg = ((((R5 * g + R4) * g + R3) * g + R2) * g + R1) * g; 
#elif BITS>=33 && BITS<=50 
    rg = ((((((R7*g+R6)*g+R5)*g+R4)*g+R3)*g+R2)*g+R1)*g; 
#else 
    rg = (((((((R8*g+R7)*g+R6)*g+R5)*g+R4)*g+R3)*g+R2)*g+R1)*g; 
#endif 
 
    result = f + f * rg;  
    return sign ? -result : result;  
}