| 99 | } |
| 100 | |
| 101 | template<class T, class Policies> inline |
| 102 | interval<T, Policies> div_negative(const interval<T, Policies>& x, const T& yl) |
| 103 | { |
| 104 | // assert(::gecode_boost::numeric::interval_lib::user::is_neg(yl)); |
| 105 | if (::gecode_boost::numeric::interval_lib::user::is_zero(x.lower()) && |
| 106 | ::gecode_boost::numeric::interval_lib::user::is_zero(x.upper())) |
| 107 | return x; |
| 108 | typename Policies::rounding rnd; |
| 109 | typedef interval<T, Policies> I; |
| 110 | const T& xl = x.lower(); |
| 111 | const T& xu = x.upper(); |
| 112 | typedef typename Policies::checking checking; |
| 113 | if (::gecode_boost::numeric::interval_lib::user::is_neg(xu)) |
| 114 | return I(rnd.div_down(xu, yl), checking::pos_inf(), true); |
| 115 | else if (::gecode_boost::numeric::interval_lib::user::is_neg(xl)) |
| 116 | return I(checking::neg_inf(), checking::pos_inf(), true); |
| 117 | else |
| 118 | return I(checking::neg_inf(), rnd.div_up(xl, yl), true); |
| 119 | } |
| 120 | |
| 121 | template<class T, class Policies> inline |
| 122 | interval<T, Policies> div_negative(const T& x, const T& yl) |