www.pudn.com > system.rar > cmath


/****************************************************************************/ 
/*  cmath  v2.54                                                            */ 
/*  Copyright (c) 1999-2004  Texas Instruments Incorporated                 */ 
/****************************************************************************/ 
 
#ifndef __cmath__ 
#define __cmath__ 
 
#include  
 
#ifndef EDOM 
#define EDOM   1 
#endif 
 
#ifndef ERANGE 
#define ERANGE 2 
#endif 
 
#include  
#define HUGE_VAL DBL_MAX 
 
#include  
 
#ifndef __EXTERN 
#define __EXTERN 
#endif 
 
extern "C" namespace std 
{ 
   __EXTERN double sqrt (double x); 
   __EXTERN double exp  (double x); 
   __EXTERN double log  (double x); 
   __EXTERN double log10(double x); 
   __EXTERN double pow  (double x, double y); 
   __EXTERN double sin  (double x); 
   __EXTERN double cos  (double x); 
   __EXTERN double tan  (double x); 
   __EXTERN double asin (double x); 
   __EXTERN double acos (double x); 
   __EXTERN double atan (double x); 
   __EXTERN double atan2(double y, double x); 
   __EXTERN double sinh (double x); 
   __EXTERN double cosh (double x); 
   __EXTERN double tanh (double x); 
 
   __INLINE double ceil (double x); 
   __INLINE double floor(double x); 
 
#ifndef __TMS320C27XX__ 
   __EXTERN double fabs (double x); 
#endif 
 
   __EXTERN double ldexp(double x, int n); 
   __EXTERN double frexp(double x, int *exp); 
   __EXTERN double modf (double x, double *ip); 
   __EXTERN double fmod (double x, double y); 
 
   /* An inline version of fmod that works for limited domain only */ 
   /* See comments in implementation below */ 
   static inline double _FMOD(double x, double y); 
 
   /* these present in many linked images, so we'll tell you about them. */ 
   __EXTERN double _nround(double x); /* round-to-nearest */ 
   __EXTERN double _trunc(double x); /* truncate towards 0 */ 
} 
 
/* the ANSI-optional *f and *l routines */ 
#include  
#include  
 
#include  
 
#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 
 
extern "C" namespace std 
{ 
   __EXTERN double rsqrt(double x); /*   == 1/sqrt(x) but *MUCH* faster      */ 
   __EXTERN double exp2 (double x); /*9x mathematically equiv to pow(2.0 ,x) */ 
   __EXTERN double exp10(double x); /*   mathematically equiv to pow(10.0,x) */ 
   __EXTERN double log2 (double x); /*9x mathematically equiv to log(x)/log(2.0)*/ 
 
   __EXTERN double powi(double x, int i); /* equiv to pow(x,(double)i) */ 
 
   __EXTERN double cot  (double x); 
   __EXTERN double acot (double x); 
   __EXTERN double acot2(double x, double y); 
 
   __EXTERN double coth (double x); 
 
   __EXTERN double asinh(double x); /* 9x */ 
   __EXTERN double acosh(double x); /* 9x */ 
   __EXTERN double atanh(double x); /* 9x */ 
   __EXTERN double acoth(double x); 
 
#define round(x) _nround(x) /* 9x round-to-nearest   */ 
#define trunc(x) _trunc(x) /* 9x truncate towards 0 */ 
 
} /* namespace */ 
 
#endif  /* _TI_ENHANCED_MATH_H */ 
 
 
#ifdef _INLINE 
/****************************************************************************/ 
/*  Inline versions of floor, ceil, fmod                                    */ 
/****************************************************************************/ 
 
static __inline double std::floor(double x)  
{ 
   double y;  
   return (std::modf(x, &y) < 0 ? y - 1 : y); 
} 
 
static __inline double std::ceil(double x) 
{ 
   double y;  
   return (std::modf(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 double _FMOD(double x, double y) 
{ 
   double d = std::fabs(x);  
   if (d - std::fabs(y) == d) return (0); 
   std::modf(x/y, &d);   
   return (x - d * y); 
} 
 
#endif 
 
#include  
 
#ifdef __embedded_cplusplus 
//---------------------------------------------------------------------------- 
// We cannot expect the embedded C++ user to use std namespace. So we include 
// the using directive when compiled under embedded C++. 
//---------------------------------------------------------------------------- 
using namespace std; 
#endif /* __embedded_cplusplus */ 
 
#endif /* __math__ */