Boost-Geometry-Utils
view release on metacpan or search on metacpan
src/boost/geometry/util/math.hpp view on Meta::CPAN
\return true if a == b
\note If both a and b are of an integral type, comparison is done by ==.
If one of the types is floating point, comparison is done by abs and
comparing with epsilon. If one of the types is non-fundamental, it might
be a high-precision number and comparison is done using the == operator
of that class.
*/
template <typename T1, typename T2>
inline bool equals(T1 const& a, T2 const& b)
{
typedef typename select_most_precise<T1, T2>::type select_type;
return detail::equals
<
select_type,
boost::is_floating_point<select_type>::type::value
>::apply(a, b);
}
template <typename T1, typename T2>
inline bool equals_with_epsilon(T1 const& a, T2 const& b)
{
typedef typename select_most_precise<T1, T2>::type select_type;
return detail::equals_with_epsilon
<
select_type,
boost::is_floating_point<select_type>::type::value
>::apply(a, b);
}
template <typename T1, typename T2>
inline bool smaller(T1 const& a, T2 const& b)
{
typedef typename select_most_precise<T1, T2>::type select_type;
return detail::smaller
<
select_type,
boost::is_floating_point<select_type>::type::value
>::apply(a, b);
}
template <typename T1, typename T2>
inline bool larger(T1 const& a, T2 const& b)
{
typedef typename select_most_precise<T1, T2>::type select_type;
return detail::smaller
<
select_type,
boost::is_floating_point<select_type>::type::value
>::apply(b, a);
}
double const d2r = geometry::math::pi<double>() / 180.0;
double const r2d = 1.0 / d2r;
/*!
\brief Calculates the haversine of an angle
\ingroup utility
\note See http://en.wikipedia.org/wiki/Haversine_formula
haversin(alpha) = sin2(alpha/2)
*/
template <typename T>
inline T hav(T const& theta)
{
T const half = T(0.5);
T const sn = sin(half * theta);
return sn * sn;
}
/*!
\brief Short utility to return the square
\ingroup utility
\param value Value to calculate the square from
\return The squared value
*/
template <typename T>
inline T sqr(T const& value)
{
return value * value;
}
/*!
\brief Short utility to workaround gcc/clang problem that abs is converting to integer
\ingroup utility
*/
template<typename T>
inline T abs(const T& t)
{
using std::abs;
return abs(t);
}
} // namespace math
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_UTIL_MATH_HPP
( run in 0.511 second using v1.01-cache-2.11-cpan-39bf76dae61 )