template<class T, class Policies> inline interval<T, Policies> fmod(const interval<T, Policies>& x, const T& y) { if (interval_lib::detail::test_input(x, y)) return interval<T, Policies>::empty(); typename Policies::rounding rnd; typedef typename interval_lib::unprotect<interval<T, Policies> >::type I; T n = rnd.int_down(rnd.div_down(x.lower(), y)); return (const I&)x - n * I(y); }
template<class T, class Policies> inline interval<T, Policies> fmod(const T& x, const interval<T, Policies>& y) { if (interval_lib::detail::test_input(x, y)) return interval<T, Policies>::empty(); typename Policies::rounding rnd; typedef typename interval_lib::unprotect<interval<T, Policies> >::type I; const T& yb = interval_lib::detail::is_neg(x) ? y.lower() : y.upper(); T n = rnd.int_down(rnd.div_down(x, yb)); return x - n * (const I&)y; }