template<class T, class Policies> inline T width(const interval<T, Policies>& x) { if (interval_lib::detail::test_input(x)) return static_cast<T>(0); typename Policies::rounding rnd; return rnd.sub_up(x.upper(), x.lower()); }
template<class I> inline I sub(const typename I::base_type& x, const typename I::base_type& y) { typedef typename I::traits_type Policies; if (detail::test_input<typename I::base_type, Policies>(x, y)) return I::empty(); typename Policies::rounding rnd; return I(rnd.sub_down(x, y), rnd.sub_up(x, y), true); }
template<class T, class Policies> inline interval<T, Policies> operator-(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; return interval<T,Policies>(rnd.sub_down(x.lower(), y), rnd.sub_up (x.upper(), y), true); }
template<class T, class Policies> inline interval<T, Policies>& interval<T, Policies>::operator-=(const T& r) { if (interval_lib::detail::test_input(*this, r)) set_empty(); else { typename Policies::rounding rnd; set(rnd.sub_down(low, r), rnd.sub_up(up, r)); } return *this; }