cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
bfloat16.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_VALUE_BFLOAT16_H
4#define pRC_CORE_VALUE_BFLOAT16_H
5
6#include <cmath>
7#include <cstring>
8
13#include <prc/pragma.hpp>
14
15namespace pRC
16{
18 {
19 private:
20 using Representation = std::uint16_t;
21 using Float32 = float;
22
23 public:
24 static constexpr auto FromRepresentation(Representation const rep)
25 {
26 BFloat16 half = {};
27 half.mHalf = rep;
28 return half;
29 }
30
31 public:
32 ~BFloat16() = default;
33 constexpr BFloat16(BFloat16 const &) = default;
34 constexpr BFloat16(BFloat16 &&) = default;
35 constexpr BFloat16 &operator=(BFloat16 const &) & = default;
36 constexpr BFloat16 &operator=(BFloat16 &&) & = default;
37 constexpr BFloat16() = default;
38
39 BFloat16(Float32 const single)
40 {
41 using std::isnan;
42 if(isnan(single))
43 {
44 mHalf = 0x7FC0;
45 return;
46 }
47
48#ifdef __FAST_MATH__
49 auto src = reinterpret_cast<std::uint16_t const *>(&single);
50
51 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
52 mHalf = src[0];
53 #else
54 mHalf = src[1];
55 #endif // __BYTE_ORDER__
56
57#else
58 std::uint32_t src;
59 std::memcpy(&src, &single, sizeof(src));
60 auto lsb = (src >> 16) & std::uint32_t(1);
61 auto bias = 0x7FFF + lsb;
62 src += bias;
63 mHalf = static_cast<std::uint16_t>(src >> 16);
64#endif // __FAST_MATH__
65 }
66
67 operator Float32() const
68 {
69 Float32 single;
70
71 auto dst = reinterpret_cast<std::uint16_t *>(&single);
72
73#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
74 dst[0] = mHalf;
75 dst[1] = 0;
76#else
77 dst[0] = 0;
78 dst[1] = mHalf;
79#endif // __BYTE_ORDER__
80
81 BEGIN_IGNORE_DIAGNOSTIC_GCC("-Wuninitialized")
82 return single;
84 }
85
86 constexpr auto isNaN() const
87 {
88#if !defined(__FINITE_MATH_ONLY__) || __FINITE_MATH_ONLY__ == 0
89 return mHalf == 0x7FC0;
90#else
91 return false;
92#endif // ! __FINITE_MATH_ONLY__
93 }
94
95 template<class X>
97 constexpr auto &operator+=(X &&rhs) &
98 {
99 return *this = *this + forward<X>(rhs);
100 }
101
102 template<class X>
104 constexpr auto &operator-=(X &&rhs) &
105 {
106 return *this = *this - forward<X>(rhs);
107 }
108
109 template<class X>
111 constexpr auto &operator*=(X &&rhs) &
112 {
113 return *this = *this * forward<X>(rhs);
114 }
115
116 template<class X>
118 constexpr auto &operator/=(X &&rhs) &
119 {
120 return *this = *this / forward<X>(rhs);
121 }
122
123 constexpr auto operator==(BFloat16 const rhs)
124 {
125 return mHalf == rhs.mHalf;
126 }
127
128 constexpr auto operator!=(BFloat16 const rhs)
129 {
130 return mHalf != rhs.mHalf;
131 }
132
133 auto operator+() const
134 {
135 return Float32(*this);
136 }
137
138 constexpr auto operator-() const
139 {
140 return FromRepresentation(mHalf ^ 0x8000);
141 }
142
143 private:
144 Representation mHalf;
145 };
146
147 static inline constexpr auto isnan(BFloat16 const a)
148 {
149 return a.isNaN();
150 }
151}
152#endif // pRC_CORE_VALUE_BFLOAT16_H
Definition bfloat16.hpp:18
BFloat16(Float32 const single)
Definition bfloat16.hpp:39
constexpr BFloat16 & operator=(BFloat16 const &) &=default
constexpr auto & operator/=(X &&rhs) &
Definition bfloat16.hpp:118
constexpr auto operator==(BFloat16 const rhs)
Definition bfloat16.hpp:123
constexpr auto operator!=(BFloat16 const rhs)
Definition bfloat16.hpp:128
constexpr BFloat16(BFloat16 &&)=default
static constexpr auto FromRepresentation(Representation const rep)
Definition bfloat16.hpp:24
constexpr auto operator-() const
Definition bfloat16.hpp:138
constexpr auto & operator+=(X &&rhs) &
Definition bfloat16.hpp:97
constexpr BFloat16()=default
~BFloat16()=default
constexpr BFloat16(BFloat16 const &)=default
constexpr auto isNaN() const
Definition bfloat16.hpp:86
constexpr auto & operator-=(X &&rhs) &
Definition bfloat16.hpp:104
constexpr auto & operator*=(X &&rhs) &
Definition bfloat16.hpp:111
constexpr BFloat16 & operator=(BFloat16 &&) &=default
auto operator+() const
Definition bfloat16.hpp:133
Definition concepts.hpp:31
Definition cholesky.hpp:10
static constexpr auto isnan(BFloat16 const a)
Definition bfloat16.hpp:147
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43