www.pudn.com > system.rar > cmathf


/****************************************************************************/ 
/*  cmathf  v2.54                                                           */ 
/*  Copyright (c) 1999-2004  Texas Instruments Incorporated                 */ 
/****************************************************************************/ 
 
#ifndef __cmathf__ 
#define __cmathf__ 
 
#ifndef EDOM 
   #define EDOM   1 
#endif 
 
#ifndef ERANGE 
   #define ERANGE 2 
#endif 
 
#include  
 
#if (FLT_DIG == DBL_DIG) /* float is not different than double */ 
 
#include  
 
#define sqrtf    sqrt 
#define expf     exp 
#define logf     log 
#define log10f   log10 
#define powf     pow 
#define sinf     sin 
#define cosf     cos 
#define tanf     tan 
#define asinf    asin 
#define acosf    acos 
#define atanf    atan 
#define atan2f   atan2 
#define sinhf    sinh 
#define coshf    cosh 
#define tanhf    tanh 
 
#define ceilf    ceil 
#define floorf   floor 
 
#define fabsf    fabs 
 
#define ldexpf   ldexp 
#define frexpf   frexp 
#define modff    modf 
#define fmodf    fmod 
 
#ifdef _TI_ENHANCED_MATH_H 
 
#define HUGE_VALF FLT_MAX 
 
#define rsqrtf   rsqrt 
#define exp2f    exp2 
#define exp10f   exp10 
#define log2f    log2 
#define powif    powi 
#define cotf     cot 
#define acotf    acot 
#define acot2f   acot2 
#define cothf    coth 
#define asinhf   asinh 
#define acoshf   acosh 
#define atanhf   atanh 
#define acothf   acoth 
#define truncf   _trunc 
#define roundf   _nround 
 
#endif 
 
#else /* float is different than double */ 
 
#include  
 
extern "C" namespace std 
{ 
   __EXTERN float sqrtf (float x); 
   __EXTERN float expf  (float x); 
   __EXTERN float logf  (float x); 
   __EXTERN float log10f(float x); 
   __EXTERN float powf  (float x, float y); 
   __EXTERN float sinf  (float x); 
   __EXTERN float cosf  (float x); 
   __EXTERN float tanf  (float x); 
   __EXTERN float asinf (float x); 
   __EXTERN float acosf (float x); 
   __EXTERN float atanf (float x); 
   __EXTERN float atan2f(float y, float x); 
   __EXTERN float sinhf (float x); 
   __EXTERN float coshf (float x); 
   __EXTERN float tanhf (float x); 
 
   __INLINE float ceilf (float x); 
   __INLINE float floorf(float x); 
 
   __EXTERN float fabsf (float x); 
 
   __EXTERN float ldexpf(float x, int n); 
   __EXTERN float frexpf(float x, int *exp); 
   __EXTERN float modff (float x, float *ip); 
   __EXTERN float fmodf (float x, float y); 
 
   /* An inline version of fmodf that works for limited domain only */ 
   /* See comments in implementation below */ 
   static inline float _FMODF(float x, float y); 
 
   /* these present in many linked images, so we'll tell you about them. */ 
   __EXTERN float _roundf(float x); /* round-to-nearest */ 
   __EXTERN float _truncf(float x); /* truncate towards 0 */ 
} 
 
#ifdef _TI_ENHANCED_MATH_H 
#if 0 
   /* ------------------------------------------------- */ 
   /* Routines below are an addition to ANSI math.h     */ 
   /* Some (noted with "9x" in comment) will become ANSI*/ 
   /* once C9x is approved.                             */ 
   /* ------------------------------------------------- */ 
#endif 
 
#define HUGE_VALF FLT_MAX /* 9x */ 
 
extern "C" namespace std 
{ 
   __EXTERN float rsqrtf(float x); /*   == 1/sqrtf(x) but *MUCH* faster      */ 
   __EXTERN float exp2f (float x); /*9x mathematically equiv to powf(2.0 ,x) */ 
   __EXTERN float exp10f(float x); /*   mathematically equiv to powf(10.0,x) */ 
   __EXTERN float log2f (float x); /*9x mathematically equiv to logf(x)/logf(2.)*/ 
 
   __EXTERN float powif (float x, int i); /* equiv to powf(x,(float)i) */ 
 
   __EXTERN float cotf  (float x); 
   __EXTERN float acotf (float x); 
   __EXTERN float acot2f(float x, float y); 
 
   __EXTERN float cothf (float x); 
 
   __EXTERN float asinhf(float x); /* 9x */ 
   __EXTERN float acoshf(float x); /* 9x */ 
   __EXTERN float atanhf(float x); /* 9x */ 
   __EXTERN float acothf(float x); 
 
#define roundf(x) _roundf(x) /* 9x round-to-nearest   */ 
#define truncf(x) _truncf(x) /* 9x truncate towards 0 */ 
 
} /* namespace */ 
 
#endif 
 
 
 
#ifdef _INLINE 
/****************************************************************************/ 
/*  Inline versions of floorf, ceilf, fmodf                                 */ 
/****************************************************************************/ 
 
static inline float std::floorf(float x)  
{ 
   float y;  
   return (std::modff(x, &y) < 0 ? y - 1 : y); 
} 
 
static inline float std::ceilf(float x) 
{ 
   float y;  
   return (std::modff(x, &y) > 0 ? y + 1 : y); 
} 
 
/*  
   The implementation below does not work correctly for all cases. 
   Consider the case of fmod(Big, 3), for any Big > 2**(MANT_DIG+2). 
   The correct result is one of 0,1, or 2. 
   But the implementation below will *always* return 0  
   because the quotient is only an approximation. 
*/ 
static inline float _FMODF(float x, float y) 
{ 
   float d = std::fabsf(x);  
   if (d - std::fabsf(y) == d) return (0); 
   std::modff(x/y, &d);   
   return (x - d * y); 
} 
 
#endif 
 
#include  
 
#endif /* float is/isnot different than double */ 
 
#endif /* __cmathf__ */