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


/****************************************************************************/ 
/*  asin   v2.54                                                            */ 
/*  Copyright (c) 1995-2004 Texas Instruments Incorporated                  */ 
/****************************************************************************/ 
#include  
#include  
#include  
 
/****************************************************************************/ 
/*  ASIN() - Arcsine							    */ 
/*									    */ 
/*  Based on the algorithm from "Software Manual for the Elementary         */ 
/*  Functions", Cody and Waite, Prentice Hall 1980, chapter 10.             */ 
/*									    */ 
/*  Y = abs(x)								    */ 
/*  if Y > 0.5, g = (1 - Y) / 2, Y = - 2 * sqrt(g), i = 1		    */ 
/*  if Y < 0.5, g = Y * Y, i = 0					    */ 
/*  R = polynomial expression			 			    */ 
/*									    */ 
/*  result = Y + Y * R							    */ 
/*									    */ 
/*  if x < 0, result = -ci - result - ci 				    */ 
/*  if x > 0, result = ci + result + ci		  			    */ 
/****************************************************************************/ 
double asin(double x) 
{ 
    double p, q, g, y; 
    static const _DATA_ACCESS double c[2] = {0.0, 0.78539816339744830962}; 
    int i = 0; 
 
    if ((y = fabs(x)) > 0.5) 
    { 
       /*******************************************************************/ 
       /* check if input is out of the domain of the function             */ 
       /*******************************************************************/ 
       if (y > 1.0) { errno = EDOM; return (0.0); } 
 
       i = 1;	 
       g = (1.0 - y) * 0.5;	 
       y = -2.0 * sqrt(g); 
    } 
    else g = y * y;		 
 
  /************************************************************************/ 
  /* determine polynomial expression                                      */ 
  /************************************************************************/ 
#if BITS<=24 
    p = (ASP2 * g + ASP1) * g; 
    q = (g + ASQ1) * g + ASQ0; 
#elif BITS>=25 && BITS<=36 
    p = ((ASP3 * g + ASP2) * g + ASP1) * g; 
    q = ((g + ASQ2) * g + ASQ1) * g + ASQ0; 
#elif BITS>=37 && BITS<=48 
    p = (((ASP4 * g + ASP3) * g + ASP2) * g + ASP1) * g; 
    q = (((g + ASQ3) * g + ASQ2) * g + ASQ1) * g + ASQ0; 
#else 
    p = ((((ASP5 * g + ASP4) * g + ASP3) * g + ASP2) * g + ASP1) * g; 
    q = ((((g + ASQ4) * g + ASQ3) * g + ASQ2) * g + ASQ1) * g + ASQ0; 
#endif 
 
    return (x < 0) ? (-((c[i] + y + y * p / q) + c[i])) 
		   : ((c[i] + y + y * p / q) + c[i]); 
}