cMHN 1.1
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 static_assert(sizeof(Float32) == 2 * sizeof(Representation));
24
25 public:
26 static constexpr auto FromRepresentation(Representation const rep)
27 {
28 BFloat16 half = {};
29 half.mHalf = rep;
30 return half;
31 }
32
33 public:
34 ~BFloat16() = default;
35 constexpr BFloat16(BFloat16 const &) = default;
36 constexpr BFloat16(BFloat16 &&) = default;
37 constexpr BFloat16 &operator=(BFloat16 const &) & = default;
38 constexpr BFloat16 &operator=(BFloat16 &&) & = default;
39 constexpr BFloat16() = default;
40
41 BFloat16(Float32 const single)
42 {
43 using std::isnan;
44 if(isnan(single))
45 {
46 mHalf = 0x7FC0;
47 return;
48 }
49
50#ifdef __FAST_MATH__
51 auto src = reinterpret_cast<std::uint16_t const *>(&single);
52
53# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
54 mHalf = src[0];
55# else
56 mHalf = src[1];
57# endif // __BYTE_ORDER__
58
59#else
60 std::uint32_t src;
61 std::memcpy(&src, &single, sizeof(src));
62 auto lsb = (src >> 16) & std::uint32_t(1);
63 auto bias = 0x7FFF + lsb;
64 src += bias;
65 mHalf = static_cast<std::uint16_t>(src >> 16);
66#endif // __FAST_MATH__
67 }
68
69 operator Float32() const
70 {
71 Float32 single;
72
73 auto dst = reinterpret_cast<std::uint16_t *>(&single);
74
75#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
76 dst[0] = mHalf;
77 dst[1] = 0;
78#else
79 dst[0] = 0;
80 dst[1] = mHalf;
81#endif // __BYTE_ORDER__
82
83 BEGIN_IGNORE_DIAGNOSTIC_GCC("-Wuninitialized")
84 return single;
86 }
87
88 constexpr auto isNaN() const
89 {
90#if !defined(__FINITE_MATH_ONLY__) || __FINITE_MATH_ONLY__ == 0
91 return mHalf == 0x7FC0;
92#else
93 return false;
94#endif // ! __FINITE_MATH_ONLY__
95 }
96
97 template<class X, If<IsInvocable<Add, BFloat16 &, X>> = 0>
98 constexpr auto &operator+=(X &&rhs) &
99 {
100 return *this = *this + forward<X>(rhs);
101 }
102
103 template<class X, If<IsInvocable<Sub, BFloat16 &, X>> = 0>
104 constexpr auto &operator-=(X &&rhs) &
105 {
106 return *this = *this - forward<X>(rhs);
107 }
108
109 template<class X, If<IsInvocable<Mul, BFloat16 &, X>> = 0>
110 constexpr auto &operator*=(X &&rhs) &
111 {
112 return *this = *this * forward<X>(rhs);
113 }
114
115 template<class X, If<IsInvocable<Div, BFloat16 &, X>> = 0>
116 constexpr auto &operator/=(X &&rhs) &
117 {
118 return *this = *this / forward<X>(rhs);
119 }
120
121 constexpr auto operator==(BFloat16 const rhs)
122 {
123 return mHalf == rhs.mHalf;
124 }
125
126 constexpr auto operator!=(BFloat16 const rhs)
127 {
128 return mHalf != rhs.mHalf;
129 }
130
131 auto operator+() const
132 {
133 return Float32(*this);
134 }
135
136 constexpr auto operator-() const
137 {
138 return FromRepresentation(mHalf ^ 0x8000);
139 }
140
141 private:
142 Representation mHalf;
143 };
144
145 static inline constexpr auto isnan(BFloat16 const a)
146 {
147 return a.isNaN();
148 }
149}
150#endif // pRC_CORE_VALUE_BFLOAT16_H
Definition bfloat16.hpp:18
BFloat16(Float32 const single)
Definition bfloat16.hpp:41
constexpr auto & operator*=(X &&rhs) &
Definition bfloat16.hpp:110
constexpr auto & operator-=(X &&rhs) &
Definition bfloat16.hpp:104
constexpr BFloat16 & operator=(BFloat16 const &) &=default
constexpr auto operator==(BFloat16 const rhs)
Definition bfloat16.hpp:121
constexpr auto operator!=(BFloat16 const rhs)
Definition bfloat16.hpp:126
constexpr BFloat16(BFloat16 &&)=default
constexpr auto & operator+=(X &&rhs) &
Definition bfloat16.hpp:98
static constexpr auto FromRepresentation(Representation const rep)
Definition bfloat16.hpp:26
constexpr auto operator-() const
Definition bfloat16.hpp:136
constexpr BFloat16()=default
~BFloat16()=default
constexpr auto & operator/=(X &&rhs) &
Definition bfloat16.hpp:116
constexpr BFloat16(BFloat16 const &)=default
constexpr auto isNaN() const
Definition bfloat16.hpp:88
constexpr BFloat16 & operator=(BFloat16 &&) &=default
auto operator+() const
Definition bfloat16.hpp:131
Definition cholesky.hpp:18
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
static constexpr auto isnan(BFloat16 const a)
Definition bfloat16.hpp:145
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43