5#define _USE_MATH_DEFINES
11#if defined(__APPLE__) && !defined(__NVCC__)
13void sincosf(
const float &x,
float *s,
float *c)
19void sincos(
const double &x,
double *s,
double *c)
23#elif defined(_MSC_VER)
25void sincosf(
const float &x,
float *s,
float *c)
32void sincos(
const double &x,
double *s,
double *c)
40inline namespace math {
42#define VECCORE_MATH_UNARY_FUNCTION(F, f) \
43template <typename T> \
44VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE \
48 for(size_t i = 0; i < VectorSize<T>(); ++i) \
49 Set(ret, i, std::f(Get(x,i))); \
53#define VECCORE_MATH_BINARY_FUNCTION(F, f) \
54template <typename T> \
55VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE \
56T F(const T &x, const T &y) \
59 for(size_t i = 0; i < VectorSize<T>(); ++i) \
60 Set(ret, i, std::f(Get(x,i), Get(y,i))); \
71T
Min(
const T &a,
const T &b)
73 return Blend(a < b, a, b);
79T
Max(
const T &a,
const T &b)
81 return Blend(a > b, a, b);
87T
Min(
const T &a,
const T &b,
const T &c)
95T
Max(
const T &a,
const T &b,
const T &c)
100template <
typename T,
template <
typename>
class Wrapper>
103Wrapper<T>
Min(
const Wrapper<T> &a,
const Wrapper<T> &b)
105 return Blend(a < b, a, b);
108template <
typename T,
template <
typename>
class Wrapper>
111Wrapper<T>
Max(
const Wrapper<T> &a,
const Wrapper<T> &b)
113 return Blend(a > b, a, b);
148void SinCos(
const float &x,
float *s,
float *c)
156void SinCos(
const double &x,
double *s,
double *c)
192 for(
size_t i = 0; i < VectorSize<T>(); ++i)
193 Set(ret, i, std::frexp(
Get(x,i), &exp[i]));
203 for(
size_t i = 0; i < VectorSize<T>(); ++i)
204 Set(ret, i, std::ldexp(
Get(x,i), exp));
214 for(
size_t i = 0; i < VectorSize<T>(); ++i)
215 Set(ret, i, std::modf(
Get(x,i), &intpart[i]));
225 for(
size_t i = 0; i < VectorSize<T>(); ++i)
226 Set(ret, i, std::sqrt(
Get(ret,i)));
236 for(
size_t i = 0; i < VectorSize<T>(); ++i)
237 Set(ret, i, std::scalbn(
Get(x,i), n));
247 for(
size_t i = 0; i < VectorSize<T>(); ++i)
248 Set(ret, i, std::scalbln(
Get(x,i), n));
291constexpr T
Deg(
const T &x)
293 return (x * T(180.0 / M_PI));
299constexpr T
Rad(
const T &x)
301 return (x * T(M_PI / 180.0));
304#undef VECCORE_MATH_UNARY_FUNCTION
305#undef VECCORE_MATH_BINARY_FUNCTION
#define VECCORE_ATT_HOST_DEVICE
#define VECCORE_FORCE_INLINE
#define VECCORE_MATH_UNARY_FUNCTION(F, f)
#define VECCORE_MATH_BINARY_FUNCTION(F, f)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE constexpr T Rad(const T &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Sign(const T &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE constexpr T Deg(const T &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Mask< T > IsNegative(const T &x)
VECCORE_FORCE_INLINE void SinCos(const UME::SIMD::SIMDVec_f< T, N > &x, UME::SIMD::SIMDVec_f< T, N > *s, UME::SIMD::SIMDVec_f< T, N > *c)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Max(const T &a, const T &b)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Scalbn(const T &x, int n)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Scalbln(const T &x, long int n)
VECCORE_FORCE_INLINE UME::SIMD::SIMDVecMask< N > IsInf(const UME::SIMD::SIMDVec_f< T, N > &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Frexp(const T &x, int *exp)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Modf(const T &x, T *intpart)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Ldexp(const T &x, int exp)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Rsqrt(const T &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Min(const T &a, const T &b)
VECCORE_FORCE_INLINE Vc::SimdArray< T, N > CopySign(const Vc::SimdArray< T, N > &x, const Vc::SimdArray< T, N > &y)
VECCORE_FORCE_INLINE Vc::SimdArray< T, N > Tan(const Vc::SimdArray< T, N > &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Scalar< T > Get(const T &v, size_t i)
typename TypeTraits< T >::MaskType Mask
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Blend(const Mask< T > &mask, const T &src1, const T &src2)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE void Set(T &v, size_t i, Scalar< T > const val)