36 #if !defined(LIBCOYOTL_REALUTIL_H) 37 #define LIBCOYOTL_REALUTIL_H 53 T result, fraction, dummy;
55 fraction = fabs(modf(x,&result));
57 if (fraction == T(0.0))
60 if (fraction == T(0.5))
62 if (modf(result / T(2.0), &dummy) != T(0.0))
72 if (fraction > T(0.5))
93 T sigdig(T x,
unsigned short n)
95 T scale_factor, result;
98 if ((n == 0) || (n > std::numeric_limits<T>::digits10))
104 scale_factor = pow(T(10.0),T((
int)n - 1 - (
int)floor(log10(fabs(x)))));
107 result = round_nearest(x * scale_factor) / scale_factor;
128 template <
typename T>
129 bool are_equal(T a, T b, T tolerance = T(1.0))
132 T adjustment = tolerance * std::numeric_limits<T>::epsilon();
135 T low = b - adjustment;
136 T hi = b + adjustment;
139 return ((a >= low) && (a <= hi));
146 unsigned long lcm(
unsigned long x,
unsigned long y);
152 unsigned long gcd(
unsigned long x,
unsigned long y);
158 template <
class T>
inline T abs_val(T value)
160 return (value < 0 ? (-value) : value);
167 inline unsigned long abs_val(
unsigned long value)
176 inline unsigned int abs_val(
unsigned int value)
185 inline unsigned short abs_val(
unsigned short value)
194 inline unsigned char abs_val(
unsigned char value)
203 template <
class T>
inline T min_of(T x1,T x2)
205 return (x1 < x2 ? x1 : x2);
212 template <
class T>
inline T max_of(T x1,T x2)
214 return (x1 > x2 ? x1 : x2);
221 inline double asinh(
const double& x)
223 return log(x + sqrt(x * x + 1.0));
230 inline double acosh(
const double& x)
232 return log(x + sqrt(x * x - 1.0));
239 inline double atanh(
const double& x)
241 return log((1.0 + x) / (1.0 - x)) / 2.0;