Skip to content

Commit

Permalink
fix ADL for expm1, log, log2
Browse files Browse the repository at this point in the history
  • Loading branch information
neilkichler committed Jul 9, 2024
1 parent 3646902 commit bcb35ec
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions include/cuinterval/arithmetic/basic.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -718,61 +718,70 @@ inline constexpr __device__ interval<T> exp10(interval<T> x)
template<typename T>
inline constexpr __device__ interval<T> expm1(interval<T> x)
{
using std::expm1;

if (empty(x)) {
return x;
}

return { intrinsic::next_after(std::expm1(x.lb), static_cast<T>(-1)), intrinsic::next_floating(std::expm1(x.ub)) };
return { intrinsic::next_after(expm1(x.lb), static_cast<T>(-1)), intrinsic::next_floating(expm1(x.ub)) };
}

template<typename T>
inline constexpr __device__ interval<T> log(interval<T> x)
{
using std::log;

if (empty(x) || sup(x) == 0) {
return empty<T>();
}

auto xx = intersection(x, { static_cast<T>(0), intrinsic::pos_inf<T>() });

return { intrinsic::prev_floating(std::log(xx.lb)), intrinsic::next_floating(std::log(xx.ub)) };
return { intrinsic::prev_floating(log(xx.lb)), intrinsic::next_floating(log(xx.ub)) };
}

// NOTE: The overestimation on the lower and upper bound is at most 2 ulps (unit in the last place)
// (due to underlying function having error of at most 1 ulp).
template<typename T>
inline constexpr __device__ interval<T> log2(interval<T> x)
{
using std::log2;

if (empty(x) || sup(x) == 0) {
return empty<T>();
}

auto xx = intersection(x, { static_cast<T>(0), intrinsic::pos_inf<T>() });
// return { intrinsic::prev_floating(std::log2(x.lb)), intrinsic::next_floating(std::log2(x.ub)) };
return { (xx.lb != 1) * intrinsic::prev_floating(intrinsic::prev_floating(std::log2(xx.lb))),
(xx.ub != 1) * intrinsic::next_floating(intrinsic::next_floating(std::log2(xx.ub))) };
return { (xx.lb != 1) * intrinsic::prev_floating(intrinsic::prev_floating(log2(xx.lb))),
(xx.ub != 1) * intrinsic::next_floating(intrinsic::next_floating(log2(xx.ub))) };
}

template<typename T>
inline constexpr __device__ interval<T> log10(interval<T> x)
{
using std::log10;

if (empty(x) || sup(x) == 0) {
return empty<T>();
}

auto xx = intersection(x, { static_cast<T>(0), intrinsic::pos_inf<T>() });
return { (xx.lb != 1) * intrinsic::prev_floating(intrinsic::prev_floating(std::log10(xx.lb))),
(xx.ub != 1) * intrinsic::next_floating(intrinsic::next_floating(std::log10(xx.ub))) };
return { (xx.lb != 1) * intrinsic::prev_floating(intrinsic::prev_floating(log10(xx.lb))),
(xx.ub != 1) * intrinsic::next_floating(intrinsic::next_floating(log10(xx.ub))) };
}

template<typename T>
inline constexpr __device__ interval<T> log1p(interval<T> x)
{
using std::log1p;

if (empty(x) || sup(x) == -1) {
return x;
}

auto xx = intersection(x, { static_cast<T>(-1), intrinsic::pos_inf<T>() });
return { intrinsic::prev_floating(std::log1p(x.lb)), intrinsic::next_floating(std::log1p(x.ub)) };
return { intrinsic::prev_floating(log1p(x.lb)), intrinsic::next_floating(log1p(x.ub)) };
}

template<typename T>
Expand Down

0 comments on commit bcb35ec

Please sign in to comment.