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


/****************************************************************************/ 
/*  exp    v2.54                                                            */ 
/*  Copyright (c) 1995-2004 Texas Instruments Incorporated                  */ 
/****************************************************************************/ 
#include  
#include  
#include  
 
/****************************************************************************/ 
/*  EXP() - e ^ x							    */ 
/*									    */ 
/*  Based on the algorithm from "Software Manual for the Elementary         */ 
/*  Functions", Cody and Waite, Prentice Hall 1980, chapter 6.              */ 
/*									    */ 
/*  N = round(x / ln(2))						    */ 
/*  g = x - N * ln(2)							    */ 
/*  z = g * g								    */ 
/*									    */ 
/*  R = polynomial expansion						    */ 
/*									    */ 
/*  result = R * 2 ^ (N	+ 1)						    */ 
/****************************************************************************/ 
double exp(double x) 
{ 
    double g, z, q, p; 
    int n; 
 
    /*************************************************************************/ 
    /* check if input would produce output out of the range of this function */ 
    /*************************************************************************/ 
    if (x > MAXX) { errno = ERANGE; return (HUGE_VAL); } 
 
    if (x < 0) n = (int) (x * INVLOGe2 - 0.5);    /* since (int) -1.5 = -1.0 */ 
    else       n = (int) (x * INVLOGe2 + 0.5); 
 
    /*************************************************************************/ 
    /* g = x - n * ln(2) (but more mathematically stable)                    */ 
    /*************************************************************************/ 
    g  = (x - n * C3) - n * C4; 
 
    /*************************************************************************/ 
    /* determine polynomial expression                                       */ 
    /*************************************************************************/ 
    z  = g * g; 
 
#if BITS <=29 
    p = (EXP1 * z + EXP0) * g; 
    q = EXQ1 * z + EXQ0; 
#elif BITS>=30 && BITS<=42 
    p = (EXP1 * z + EXP0) * g; 
    q = (EXQ2 * z + EXQ1) * z + EXQ0; 
#elif BITS>=43 && BITS<=56 
    p = ((EXP2 * z + EXP1) * z + EXP0) * g; 
    q = (EXQ2 * z + EXQ1) * z + EXQ0; 
#else 
    p = ((EXP2 * z + EXP1) * z + EXP0) * g; 
    q = ((EXQ3 * z + EXQ2) * z + EXQ1) * z + EXQ0; 
#endif 
 
    /*************************************************************************/ 
    /* exp(x) = exp(g) * 2 ^ (n + 1)                                         */ 
    /*************************************************************************/ 
    return ldexp(0.5 + p / (q - p), n + 1);  
}