diff options
Diffstat (limited to 'third_party/xsimd/include/xsimd/arch/generic/xsimd_generic_rounding.hpp')
-rw-r--r-- | third_party/xsimd/include/xsimd/arch/generic/xsimd_generic_rounding.hpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/third_party/xsimd/include/xsimd/arch/generic/xsimd_generic_rounding.hpp b/third_party/xsimd/include/xsimd/arch/generic/xsimd_generic_rounding.hpp new file mode 100644 index 0000000000..b6a79a4515 --- /dev/null +++ b/third_party/xsimd/include/xsimd/arch/generic/xsimd_generic_rounding.hpp @@ -0,0 +1,72 @@ +/*************************************************************************** + * Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and * + * Martin Renou * + * Copyright (c) QuantStack * + * Copyright (c) Serge Guelton * + * * + * Distributed under the terms of the BSD 3-Clause License. * + * * + * The full license is in the file LICENSE, distributed with this software. * + ****************************************************************************/ + +#ifndef XSIMD_GENERIC_ROUNDING_HPP +#define XSIMD_GENERIC_ROUNDING_HPP + +#include "./xsimd_generic_details.hpp" + +namespace xsimd +{ + + namespace kernel + { + + using namespace types; + + // ceil + template <class A, class T> + inline batch<T, A> ceil(batch<T, A> const& self, requires_arch<generic>) noexcept + { + batch<T, A> truncated_self = trunc(self); + return select(truncated_self < self, truncated_self + 1, truncated_self); + } + + // floor + template <class A, class T> + inline batch<T, A> floor(batch<T, A> const& self, requires_arch<generic>) noexcept + { + batch<T, A> truncated_self = trunc(self); + return select(truncated_self > self, truncated_self - 1, truncated_self); + } + + // round + template <class A, class T> + inline batch<T, A> round(batch<T, A> const& self, requires_arch<generic>) noexcept + { + auto v = abs(self); + auto c = ceil(v); + auto cp = select(c - 0.5 > v, c - 1, c); + return select(v > constants::maxflint<batch<T, A>>(), self, copysign(cp, self)); + } + + // trunc + template <class A, class T, class = typename std::enable_if<std::is_integral<T>::value, void>::type> + inline batch<T, A> trunc(batch<T, A> const& self, requires_arch<generic>) noexcept + { + return self; + } + template <class A> + inline batch<float, A> trunc(batch<float, A> const& self, requires_arch<generic>) noexcept + { + return select(abs(self) < constants::maxflint<batch<float, A>>(), to_float(to_int(self)), self); + } + template <class A> + inline batch<double, A> trunc(batch<double, A> const& self, requires_arch<generic>) noexcept + { + return select(abs(self) < constants::maxflint<batch<double, A>>(), to_float(to_int(self)), self); + } + + } + +} + +#endif |