template<class T, class Policies> inline interval<T, Policies> operator/(const T& x, const interval<T, Policies>& y) { if (interval_lib::detail::test_input(x, y)) return interval<T, Policies>::empty(); if (zero_in(y)) if (!interval_lib::user::is_zero(y.lower())) if (!interval_lib::user::is_zero(y.upper())) return interval_lib::detail::div_zero<T, Policies>(x); else return interval_lib::detail::div_negative<T, Policies>(x, y.lower()); else if (!interval_lib::user::is_zero(y.upper())) return interval_lib::detail::div_positive<T, Policies>(x, y.upper()); else return interval<T, Policies>::empty(); else return interval_lib::detail::div_non_zero(x, y); }
template<class T, class Policies> inline interval<T, Policies> division_part1(const interval<T, Policies>& x, const interval<T, Policies>& y, bool& b) { typedef interval<T, Policies> I; b = false; if (detail::test_input(x, y)) return I::empty(); if (zero_in(y)) if (!user::is_zero(y.lower())) if (!user::is_zero(y.upper())) return detail::div_zero_part1(x, y, b); else return detail::div_negative(x, y.lower()); else if (!user::is_zero(y.upper())) return detail::div_positive(x, y.upper()); else return I::empty(); else return detail::div_non_zero(x, y); }
template<class T, class Policies> inline interval<T, Policies> multiplicative_inverse(const interval<T, Policies>& x) { typedef interval<T, Policies> I; if (detail::test_input(x)) return I::empty(); T one = static_cast<T>(1); typename Policies::rounding rnd; if (zero_in(x)) { typedef typename Policies::checking checking; if (!user::is_zero(x.lower())) if (!user::is_zero(x.upper())) return I::whole(); else return I(checking::neg_inf(), rnd.div_up(one, x.lower()), true); else if (!user::is_zero(x.upper())) return I(rnd.div_down(one, x.upper()), checking::pos_inf(), true); else return I::empty(); } else return I(rnd.div_down(one, x.upper()), rnd.div_up(one, x.lower()), true); }