14namespace alpaka::math::internal
20 concept FloatingPoint = std::is_same_v<T, float> || std::is_same_v<T, double>;
24 template<concepts::FloatingPo
int T>
25 constexpr bool ieeeIsnan(T
const& arg)
27 if constexpr(std::is_same_v<T, float>)
29 constexpr uint32_t expMask = 0x7F80'0000;
30 constexpr uint32_t fracMask = 0x007F'FFFF;
31 auto bits = std::bit_cast<uint32_t>(arg);
32 return ((bits & expMask) == expMask) && (bits & fracMask);
34 else if constexpr(std::is_same_v<T, double>)
36 constexpr uint64_t expMask = 0x7FF0'0000'0000'0000ULL;
37 constexpr uint64_t fracMask = 0x000F'FFFF'FFFF'FFFFULL;
38 auto bits = std::bit_cast<uint64_t>(arg);
39 return ((bits & expMask) == expMask) && (bits & fracMask);
45 template<concepts::FloatingPo
int T>
46 constexpr bool ieeeIsinf(T
const& arg)
48 if constexpr(std::is_same_v<T, float>)
50 constexpr uint32_t expMask = 0x7F80'0000;
51 constexpr uint32_t fracMask = 0x007F'FFFF;
52 auto bits = std::bit_cast<uint32_t>(arg);
53 return ((bits & expMask) == expMask) && !(bits & fracMask);
55 else if constexpr(std::is_same_v<T, double>)
57 constexpr uint64_t expMask = 0x7FF0'0000'0000'0000ULL;
58 constexpr uint64_t fracMask = 0x000F'FFFF'FFFF'FFFFULL;
59 auto bits = std::bit_cast<uint64_t>(arg);
60 return ((bits & expMask) == expMask) && !(bits & fracMask);
66 template<concepts::FloatingPo
int T>
67 constexpr bool ieeeIsfinite(T
const& arg)
69 if constexpr(std::is_same_v<T, float>)
71 constexpr uint32_t expMask = 0x7F80'0000;
72 auto bits = std::bit_cast<uint32_t>(arg);
73 return (bits & expMask) != expMask;
75 else if constexpr(std::is_same_v<T, double>)
77 constexpr uint64_t expMask = 0x7FF0'0000'0000'0000ULL;
78 auto bits = std::bit_cast<uint64_t>(arg);
79 return (bits & expMask) != expMask;
#define ALPAKA_UNREACHABLE(...)
Before CUDA 11.5 nvcc is unable to correctly identify return statements in 'if constexpr' branches....