29 #include <type_traits> 40 template <
typename Number>
41 constexpr Number abs(Number val)
43 return (val < Number{0}) ? -val : val;
49 template <
typename NumberL,
typename NumberR>
50 constexpr
typename std::common_type<NumberL, NumberR>::type (max)(NumberL lval, NumberR rval)
52 return (lval < rval) ? rval : lval;
58 template <
typename NumberL,
typename NumberR>
59 constexpr
typename std::common_type<NumberL, NumberR>::type (min)(NumberL lval, NumberR rval)
61 return (lval < rval) ? lval : rval;
73 template <
typename EpsilonType = float,
74 typename LNumber,
typename RNumber>
75 bool float_equals(
const LNumber &lhs,
const RNumber &rhs,
76 int epsilon_scale = 20)
79 using common_t =
typename std::common_type<LNumber, RNumber>::type;
81 static_assert(std::is_floating_point<LNumber>::value || std::is_floating_point<RNumber>::value,
82 "Using this function with two integers is just wasting time. Use ==");
83 static_assert(std::numeric_limits<EpsilonType>::epsilon() < EpsilonType{1},
84 "epsilon >= 1.0 will cause all comparisons to return true");
87 if (std::isnan(lhs) || std::isnan(rhs))
94 constexpr common_t epsilon =
static_cast<common_t
>(std::numeric_limits<EpsilonType>::epsilon());
99 common_t scaled_fuzz = epsilon_scale * epsilon * max(max(xlnt::detail::abs<common_t>(lhs),
100 xlnt::detail::abs<common_t>(rhs)),
102 return ((lhs + scaled_fuzz) >= rhs) && ((rhs + scaled_fuzz) >= lhs);
Enumerates the possible types a cell can be determined by it's current value.
Definition: cell.hpp:37