Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 53 additions & 25 deletions include/boost/numeric/interval/arith.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,21 @@ namespace numeric {
*/

template<class T, class Policies> inline
const interval<T, Policies>& operator+(const interval<T, Policies>& x)
BOOST_GPU_ENABLED const interval<T, Policies>& operator+(const interval<T, Policies>& x)
{
return x;
}

template<class T, class Policies> inline
interval<T, Policies> operator-(const interval<T, Policies>& x)
BOOST_GPU_ENABLED interval<T, Policies> operator-(const interval<T, Policies>& x)
{
if (interval_lib::detail::test_input(x))
return interval<T, Policies>::empty();
return interval<T, Policies>(-x.upper(), -x.lower(), true);
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator+=(const interval<T, Policies>& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator+=(const interval<T, Policies>& r)
{
if (interval_lib::detail::test_input(*this, r))
set_empty();
Expand All @@ -52,7 +52,7 @@ interval<T, Policies>& interval<T, Policies>::operator+=(const interval<T, Polic
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator+=(const T& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator+=(const T& r)
{
if (interval_lib::detail::test_input(*this, r))
set_empty();
Expand All @@ -64,7 +64,7 @@ interval<T, Policies>& interval<T, Policies>::operator+=(const T& r)
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator-=(const interval<T, Policies>& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator-=(const interval<T, Policies>& r)
{
if (interval_lib::detail::test_input(*this, r))
set_empty();
Expand All @@ -76,7 +76,7 @@ interval<T, Policies>& interval<T, Policies>::operator-=(const interval<T, Polic
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator-=(const T& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator-=(const T& r)
{
if (interval_lib::detail::test_input(*this, r))
set_empty();
Expand All @@ -88,32 +88,32 @@ interval<T, Policies>& interval<T, Policies>::operator-=(const T& r)
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator*=(const interval<T, Policies>& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator*=(const interval<T, Policies>& r)
{
return *this = *this * r;
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator*=(const T& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator*=(const T& r)
{
return *this = r * *this;
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator/=(const interval<T, Policies>& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator/=(const interval<T, Policies>& r)
{
return *this = *this / r;
}

template<class T, class Policies> inline
interval<T, Policies>& interval<T, Policies>::operator/=(const T& r)
BOOST_GPU_ENABLED interval<T, Policies>& interval<T, Policies>::operator/=(const T& r)
{
return *this = *this / r;
}

template<class T, class Policies> inline
interval<T, Policies> operator+(const interval<T, Policies>& x,
const interval<T, Policies>& y)
BOOST_GPU_ENABLED interval<T, Policies> operator+(const interval<T, Policies>& x,
const interval<T, Policies>& y)
{
if (interval_lib::detail::test_input(x, y))
return interval<T, Policies>::empty();
Expand All @@ -123,7 +123,7 @@ interval<T, Policies> operator+(const interval<T, Policies>& x,
}

template<class T, class Policies> inline
interval<T, Policies> operator+(const T& x, const interval<T, Policies>& y)
BOOST_GPU_ENABLED 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();
Expand All @@ -133,11 +133,19 @@ interval<T, Policies> operator+(const T& x, const interval<T, Policies>& y)
}

template<class T, class Policies> inline
interval<T, Policies> operator+(const interval<T, Policies>& x, const T& y)
BOOST_GPU_ENABLED interval<T, Policies> operator+(const interval<T, Policies>& x, const T& y)
{ return y + x; }

template<class T1, class Policies, class T2> inline
BOOST_GPU_ENABLED interval<T1, Policies> operator+(const T2& x, const interval<T1, Policies>& y)
{ return static_cast<T1>(x) + y; }

template<class T1, class Policies, class T2> inline
BOOST_GPU_ENABLED interval<T1, Policies> operator+(const interval<T1, Policies>& x, const T2& y)
{ return x + static_cast<T1>(y); }

template<class T, class Policies> inline
interval<T, Policies> operator-(const interval<T, Policies>& x,
BOOST_GPU_ENABLED interval<T, Policies> operator-(const interval<T, Policies>& x,
const interval<T, Policies>& y)
{
if (interval_lib::detail::test_input(x, y))
Expand All @@ -147,8 +155,8 @@ interval<T, Policies> operator-(const interval<T, Policies>& x,
rnd.sub_up (x.upper(), y.lower()), true);
}

template<class T, class Policies> inline
interval<T, Policies> operator-(const T& x, const interval<T, Policies>& y)
template<class T, class Policies> inline
BOOST_GPU_ENABLED 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();
Expand All @@ -158,7 +166,7 @@ interval<T, Policies> operator-(const T& x, const interval<T, Policies>& y)
}

template<class T, class Policies> inline
interval<T, Policies> operator-(const interval<T, Policies>& x, const T& y)
BOOST_GPU_ENABLED 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();
Expand All @@ -167,9 +175,17 @@ interval<T, Policies> operator-(const interval<T, Policies>& x, const T& y)
rnd.sub_up (x.upper(), y), true);
}

template<class T1, class Policies, class T2> inline
BOOST_GPU_ENABLED interval<T1, Policies> operator-(const T2& x, const interval<T1, Policies>& y)
{ return static_cast<T1>(x) - y; }

template<class T1, class Policies, class T2> inline
BOOST_GPU_ENABLED interval<T1, Policies> operator-(const interval<T1, Policies>& x, const T2& y)
{ return x - static_cast<T1>(y); }

template<class T, class Policies> inline
interval<T, Policies> operator*(const interval<T, Policies>& x,
const interval<T, Policies>& y)
BOOST_GPU_ENABLED interval<T, Policies> operator*(const interval<T, Policies>& x,
const interval<T, Policies>& y)
{
BOOST_USING_STD_MIN();
BOOST_USING_STD_MAX();
Expand Down Expand Up @@ -223,7 +239,7 @@ interval<T, Policies> operator*(const interval<T, Policies>& x,
}

template<class T, class Policies> inline
interval<T, Policies> operator*(const T& x, const interval<T, Policies>& y)
BOOST_GPU_ENABLED interval<T, Policies> operator*(const T& x, const interval<T, Policies>& y)
{
typedef interval<T, Policies> I;
if (interval_lib::detail::test_input(x, y))
Expand All @@ -241,11 +257,19 @@ interval<T, Policies> operator*(const T& x, const interval<T, Policies>& y)
}

template<class T, class Policies> inline
interval<T, Policies> operator*(const interval<T, Policies>& x, const T& y)
BOOST_GPU_ENABLED interval<T, Policies> operator*(const interval<T, Policies>& x, const T& y)
{ return y * x; }

template<class T1, class Policies, class T2> inline
BOOST_GPU_ENABLED interval<T1, Policies> operator*(const T2& x, const interval<T1, Policies>& y)
{ return static_cast<T1>(x) * y; }

template<class T1, class Policies, class T2> inline
BOOST_GPU_ENABLED interval<T1, Policies> operator*(const interval<T1, Policies>& x, const T2& y)
{ return x * static_cast<T1>(y); }

template<class T, class Policies> inline
interval<T, Policies> operator/(const interval<T, Policies>& x,
BOOST_GPU_ENABLED interval<T, Policies> operator/(const interval<T, Policies>& x,
const interval<T, Policies>& y)
{
if (interval_lib::detail::test_input(x, y))
Expand All @@ -266,7 +290,7 @@ interval<T, Policies> operator/(const interval<T, Policies>& x,
}

template<class T, class Policies> inline
interval<T, Policies> operator/(const T& x, const interval<T, Policies>& y)
BOOST_GPU_ENABLED 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();
Expand All @@ -286,7 +310,7 @@ interval<T, Policies> operator/(const T& x, const interval<T, Policies>& y)
}

template<class T, class Policies> inline
interval<T, Policies> operator/(const interval<T, Policies>& x, const T& y)
BOOST_GPU_ENABLED interval<T, Policies> operator/(const interval<T, Policies>& x, const T& y)
{
if (interval_lib::detail::test_input(x, y) || interval_lib::user::is_zero(y))
return interval<T, Policies>::empty();
Expand All @@ -299,6 +323,10 @@ interval<T, Policies> operator/(const interval<T, Policies>& x, const T& y)
return interval<T, Policies>(rnd.div_down(xl, y), rnd.div_up(xu, y), true);
}

template<class T1, class Policies, class T2> inline
BOOST_GPU_ENABLED interval<T1, Policies> operator/(const T2& x, const interval<T1, Policies>& y)
{ return static_cast<T1>(x) / y; }

} // namespace numeric
} // namespace boost

Expand Down
36 changes: 18 additions & 18 deletions include/boost/numeric/interval/arith2.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ namespace boost {
namespace numeric {

template<class T, class Policies> inline
interval<T, Policies> fmod(const interval<T, Policies>& x,
const interval<T, Policies>& y)
BOOST_GPU_ENABLED interval<T, Policies> fmod(const interval<T, Policies>& x,
const interval<T, Policies>& y)
{
if (interval_lib::detail::test_input(x, y))
return interval<T, Policies>::empty();
Expand All @@ -42,7 +42,7 @@ interval<T, Policies> fmod(const interval<T, Policies>& x,
}

template<class T, class Policies> inline
interval<T, Policies> fmod(const interval<T, Policies>& x, const T& y)
BOOST_GPU_ENABLED 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();
Expand All @@ -53,7 +53,7 @@ interval<T, Policies> fmod(const interval<T, Policies>& x, const T& y)
}

template<class T, class Policies> inline
interval<T, Policies> fmod(const T& x, const interval<T, Policies>& y)
BOOST_GPU_ENABLED 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();
Expand All @@ -67,8 +67,8 @@ interval<T, Policies> fmod(const T& x, const interval<T, Policies>& y)
namespace interval_lib {

template<class T, class Policies> inline
interval<T, Policies> division_part1(const interval<T, Policies>& x,
const interval<T, Policies>& y, bool& b)
BOOST_GPU_ENABLED interval<T, Policies> division_part1(const interval<T, Policies>& x,
const interval<T, Policies>& y, bool& b)
{
typedef interval<T, Policies> I;
b = false;
Expand All @@ -90,15 +90,15 @@ interval<T, Policies> division_part1(const interval<T, Policies>& x,
}

template<class T, class Policies> inline
interval<T, Policies> division_part2(const interval<T, Policies>& x,
const interval<T, Policies>& y, bool b = true)
BOOST_GPU_ENABLED interval<T, Policies> division_part2(const interval<T, Policies>& x,
const interval<T, Policies>& y, bool b = true)
{
if (!b) return interval<T, Policies>::empty();
return detail::div_zero_part2(x, y);
}

template<class T, class Policies> inline
interval<T, Policies> multiplicative_inverse(const interval<T, Policies>& x)
BOOST_GPU_ENABLED interval<T, Policies> multiplicative_inverse(const interval<T, Policies>& x)
{
typedef interval<T, Policies> I;
if (detail::test_input(x))
Expand All @@ -124,7 +124,7 @@ interval<T, Policies> multiplicative_inverse(const interval<T, Policies>& x)
namespace detail {

template<class T, class Rounding> inline
T pow_dn(const T& x_, int pwr, Rounding& rnd) // x and pwr are positive
BOOST_GPU_ENABLED T pow_dn(const T& x_, int pwr, Rounding& rnd) // x and pwr are positive
{
T x = x_;
T y = (pwr & 1) ? x_ : static_cast<T>(1);
Expand All @@ -138,7 +138,7 @@ T pow_dn(const T& x_, int pwr, Rounding& rnd) // x and pwr are positive
}

template<class T, class Rounding> inline
T pow_up(const T& x_, int pwr, Rounding& rnd) // x and pwr are positive
BOOST_GPU_ENABLED T pow_up(const T& x_, int pwr, Rounding& rnd) // x and pwr are positive
{
T x = x_;
T y = (pwr & 1) ? x_ : static_cast<T>(1);
Expand All @@ -155,7 +155,7 @@ T pow_up(const T& x_, int pwr, Rounding& rnd) // x and pwr are positive
} // namespace interval_lib

template<class T, class Policies> inline
interval<T, Policies> pow(const interval<T, Policies>& x, int pwr)
BOOST_GPU_ENABLED interval<T, Policies> pow(const interval<T, Policies>& x, int pwr)
{
BOOST_USING_STD_MAX();
using interval_lib::detail::pow_dn;
Expand Down Expand Up @@ -195,7 +195,7 @@ interval<T, Policies> pow(const interval<T, Policies>& x, int pwr)
}

template<class T, class Policies> inline
interval<T, Policies> sqrt(const interval<T, Policies>& x)
BOOST_GPU_ENABLED interval<T, Policies> sqrt(const interval<T, Policies>& x)
{
typedef interval<T, Policies> I;
if (interval_lib::detail::test_input(x) || interval_lib::user::is_neg(x.upper()))
Expand All @@ -206,7 +206,7 @@ interval<T, Policies> sqrt(const interval<T, Policies>& x)
}

template<class T, class Policies> inline
interval<T, Policies> square(const interval<T, Policies>& x)
BOOST_GPU_ENABLED interval<T, Policies> square(const interval<T, Policies>& x)
{
typedef interval<T, Policies> I;
if (interval_lib::detail::test_input(x))
Expand All @@ -226,7 +226,7 @@ namespace interval_lib {
namespace detail {

template< class I > inline
I root_aux(typename I::base_type const &x, int k) // x and k are bigger than one
BOOST_GPU_ENABLED I root_aux(typename I::base_type const &x, int k) // x and k are bigger than one
{
typedef typename I::base_type T;
T tk(k);
Expand All @@ -240,7 +240,7 @@ I root_aux(typename I::base_type const &x, int k) // x and k are bigger than one
}

template< class I > inline // x is positive and k bigger than one
typename I::base_type root_aux_dn(typename I::base_type const &x, int k)
BOOST_GPU_ENABLED typename I::base_type root_aux_dn(typename I::base_type const &x, int k)
{
typedef typename I::base_type T;
typedef typename I::traits_type Policies;
Expand All @@ -252,7 +252,7 @@ typename I::base_type root_aux_dn(typename I::base_type const &x, int k)
}

template< class I > inline // x is positive and k bigger than one
typename I::base_type root_aux_up(typename I::base_type const &x, int k)
BOOST_GPU_ENABLED typename I::base_type root_aux_up(typename I::base_type const &x, int k)
{
typedef typename I::base_type T;
typedef typename I::traits_type Policies;
Expand All @@ -267,7 +267,7 @@ typename I::base_type root_aux_up(typename I::base_type const &x, int k)
} // namespace interval_lib

template< class T, class Policies > inline
interval<T, Policies> nth_root(interval<T, Policies> const &x, int k)
BOOST_GPU_ENABLED interval<T, Policies> nth_root(interval<T, Policies> const &x, int k)
{
typedef interval<T, Policies> I;
if (interval_lib::detail::test_input(x)) return I::empty();
Expand Down
8 changes: 4 additions & 4 deletions include/boost/numeric/interval/arith3.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace numeric {
namespace interval_lib {

template<class I> inline
I add(const typename I::base_type& x, const typename I::base_type& y)
BOOST_GPU_ENABLED I add(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))
Expand All @@ -33,7 +33,7 @@ I add(const typename I::base_type& x, const typename I::base_type& y)
}

template<class I> inline
I sub(const typename I::base_type& x, const typename I::base_type& y)
BOOST_GPU_ENABLED 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))
Expand All @@ -43,7 +43,7 @@ I sub(const typename I::base_type& x, const typename I::base_type& y)
}

template<class I> inline
I mul(const typename I::base_type& x, const typename I::base_type& y)
BOOST_GPU_ENABLED I mul(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))
Expand All @@ -53,7 +53,7 @@ I mul(const typename I::base_type& x, const typename I::base_type& y)
}

template<class I> inline
I div(const typename I::base_type& x, const typename I::base_type& y)
BOOST_GPU_ENABLED I div(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) || user::is_zero(y))
Expand Down
Loading