diff --git a/src/basics/util.hh b/src/basics/util.hh new file mode 100644 index 0000000..d65ff64 --- /dev/null +++ b/src/basics/util.hh @@ -0,0 +1,61 @@ +/* util.hh + * vim: set tw=80: + * Eryn Wells + */ + +#ifndef __BASICS_UTIL_HH__ +#define __BASICS_UTIL_HH__ + +#include + + +/** + * A very small constant. If a value is between EPSILON and 0.0, it is + * considered to be zero. + */ +const Double EPSILON = 1.0e-10; + + +/** + * The maximum distance a ray can travel. This is the maximum value t can be. + */ +const Double MAX_DISTANCE = 1.0e7; + + +/** + * Determine if the value is "close enough" to zero. Takes the absolute value + * and compares it to `EPSILON`. + * + * @see EPSILON + * + * @param [in] value The value to check + * @returns `true` if the value is close enough to zero + */ +template +inline bool +NearZero(T value) +{ + return std::fabs(value) < EPSILON; +} + + +/** + * Determine if two values are "close enough" to be considered equal. Subtracts + * one from the other and checks if the result is near zero. + * + * @see NearZero + * + * @param [in] left The left parameter + * @param [in] right The right parameter + * @returns `true` if the values are close enough to be equal + */ +template +inline bool +NearlyEqual(T left, + U right) +{ + return NearZero(left - right); +} + +#endif /* __BASICS_UTIL_HH__ */ +