| 22 | namespace detail { |
| 23 | |
| 24 | template<class T, class Policies> inline |
| 25 | interval<T, Policies> div_non_zero(const interval<T, Policies>& x, |
| 26 | const interval<T, Policies>& y) |
| 27 | { |
| 28 | // assert(!in_zero(y)); |
| 29 | typename Policies::rounding rnd; |
| 30 | typedef interval<T, Policies> I; |
| 31 | const T& xl = x.lower(); |
| 32 | const T& xu = x.upper(); |
| 33 | const T& yl = y.lower(); |
| 34 | const T& yu = y.upper(); |
| 35 | if (::gecode_boost::numeric::interval_lib::user::is_neg(xu)) |
| 36 | if (::gecode_boost::numeric::interval_lib::user::is_neg(yu)) |
| 37 | return I(rnd.div_down(xu, yl), rnd.div_up(xl, yu), true); |
| 38 | else |
| 39 | return I(rnd.div_down(xl, yl), rnd.div_up(xu, yu), true); |
| 40 | else if (::gecode_boost::numeric::interval_lib::user::is_neg(xl)) |
| 41 | if (::gecode_boost::numeric::interval_lib::user::is_neg(yu)) |
| 42 | return I(rnd.div_down(xu, yu), rnd.div_up(xl, yu), true); |
| 43 | else |
| 44 | return I(rnd.div_down(xl, yl), rnd.div_up(xu, yl), true); |
| 45 | else |
| 46 | if (::gecode_boost::numeric::interval_lib::user::is_neg(yu)) |
| 47 | return I(rnd.div_down(xu, yu), rnd.div_up(xl, yl), true); |
| 48 | else |
| 49 | return I(rnd.div_down(xl, yu), rnd.div_up(xu, yl), true); |
| 50 | } |
| 51 | |
| 52 | template<class T, class Policies> inline |
| 53 | interval<T, Policies> div_non_zero(const T& x, const interval<T, Policies>& y) |