00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _NUMUTIL_H
00019 #define _NUMUTIL_H
00020
00021 #include <cmath>
00022 #include <cfloat>
00023 #include <limits>
00024
00025 const int WORD_LENGTH = 32;
00026 const double LN2 = 0.69314718055994528622676;
00027 const unsigned long LN2BYTES = 0xB1721814;
00028 const double NATURAL_E = 2.718281828459045;
00029
00030
00031
00032 #ifndef M_PI
00033 #define M_PI 3.14159265358979323846
00034 #endif
00035
00036 #ifndef M_E
00037 #define M_E 2.7182818284590452353
00038 #endif
00039
00040
00044 template<class T>
00045 bool isNaN( T value )
00046 {
00047 return value != value;
00048 }
00049
00050 template< typename T >
00051 bool isInfinity( T value )
00052 {
00053 return value == std::numeric_limits< T >::infinity();
00054 }
00055
00065 template< class T >
00066 bool isClose( T a, T b, T tolerance )
00067 {
00068 T epsilon = std::numeric_limits< T >::epsilon();
00069
00070 if ( a == b )
00071 return true;
00072
00073 if ( a == 0 || b == 0 )
00074 return ( fabs( a - b ) < tolerance * epsilon );
00075
00076 return (
00077 fabs( ( a - b ) / a ) < tolerance * epsilon
00078 &&
00079 fabs( ( a - b ) / b ) < tolerance * epsilon
00080 );
00081 }
00082
00083 bool almostEqual(float x, float y, float epsilon = FLT_EPSILON);
00084 bool almostEqual(double x, double y, double epsilon = DBL_EPSILON);
00085 bool almostEqual(long double x, long double y, long double epsilon = LDBL_EPSILON);
00086
00087
00088 #if defined(__TURBOC__) || defined(__BORLANDC__) || defined(_MSC_VER)
00089 #define isinf(param) !_finite(param)
00090 #define isnan(param) _isnan(param)
00091 #define round(param) floor(param+0.5)
00092 #endif
00093 #endif