alpaka
Abstraction Library for Parallel Kernel Acceleration
Loading...
Searching...
No Matches
ieee754.hpp
Go to the documentation of this file.
1/* Copyright 2025 Mehmet Yusufoglu, Andrea Bocci, René Widera
2 * SPDX-License-Identifier: MPL-2.0
3 */
4
5#pragma once
6
9
10#include <bit>
11#include <cstdint>
12#include <type_traits>
13
14namespace alpaka::math::internal
15{
16 namespace concepts
17 {
18 /** Checks for single and double floating point precision */
19 template<typename T>
20 concept FloatingPoint = std::is_same_v<T, float> || std::is_same_v<T, double>;
21 } // namespace concepts
22
23 // Bit pattern checks keep isnan portable across host/device and fast-math builds.
24 template<concepts::FloatingPoint T>
25 constexpr bool ieeeIsnan(T const& arg)
26 {
27 if constexpr(std::is_same_v<T, float>)
28 {
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);
33 }
34 else if constexpr(std::is_same_v<T, double>)
35 {
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);
40 }
41
43 }
44
45 template<concepts::FloatingPoint T>
46 constexpr bool ieeeIsinf(T const& arg)
47 {
48 if constexpr(std::is_same_v<T, float>)
49 {
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);
54 }
55 else if constexpr(std::is_same_v<T, double>)
56 {
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);
61 }
62
64 }
65
66 template<concepts::FloatingPoint T>
67 constexpr bool ieeeIsfinite(T const& arg)
68 {
69 if constexpr(std::is_same_v<T, float>)
70 {
71 constexpr uint32_t expMask = 0x7F80'0000;
72 auto bits = std::bit_cast<uint32_t>(arg);
73 return (bits & expMask) != expMask;
74 }
75 else if constexpr(std::is_same_v<T, double>)
76 {
77 constexpr uint64_t expMask = 0x7FF0'0000'0000'0000ULL;
78 auto bits = std::bit_cast<uint64_t>(arg);
79 return (bits & expMask) != expMask;
80 }
81
83 }
84} // namespace alpaka::math::internal
#define ALPAKA_UNREACHABLE(...)
Before CUDA 11.5 nvcc is unable to correctly identify return statements in 'if constexpr' branches....