bfloat16_float.cpp File Reference
#include <sstream>
#include <memory>
#include <math.h>
#include "main.h"

Namespaces

 Eigen
 Namespace containing all symbols from the Eigen library.
 

Macros

#define VERIFY_BFLOAT16_BITS_EQUAL(h, bits)    VERIFY_IS_EQUAL((numext::bit_cast<numext::uint16_t>(h)), (static_cast<numext::uint16_t>(bits)))
 

Functions

float BinaryToFloat (uint32_t sign, uint32_t exponent, uint32_t high_mantissa, uint32_t low_mantissa)
 
template<typename T >
void test_roundtrip ()
 
void test_conversion ()
 
void test_numtraits ()
 
void test_arithmetic ()
 
void test_comparison ()
 
void test_basic_functions ()
 
void test_trigonometric_functions ()
 
void test_array ()
 
void test_product ()
 
void test_nextafter ()
 
 EIGEN_DECLARE_TEST (bfloat16_float)
 

Macro Definition Documentation

◆ VERIFY_BFLOAT16_BITS_EQUAL

#define VERIFY_BFLOAT16_BITS_EQUAL (   h,
  bits 
)     VERIFY_IS_EQUAL((numext::bit_cast<numext::uint16_t>(h)), (static_cast<numext::uint16_t>(bits)))

Function Documentation

◆ BinaryToFloat()

float BinaryToFloat ( uint32_t  sign,
uint32_t  exponent,
uint32_t  high_mantissa,
uint32_t  low_mantissa 
)
24  {
25  float dest;
26  uint32_t src = (sign << 31) + (exponent << 23) + (high_mantissa << 16) + low_mantissa;
27  memcpy(static_cast<void*>(&dest), static_cast<const void*>(&src), sizeof(dest));
28  return dest;
29 }
std::uint32_t uint32_t
Definition: Meta.h:40
T sign(T x)
Definition: cxx11_tensor_builtins_sycl.cpp:172

References SYCL::sign().

Referenced by test_conversion().

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( bfloat16_float  )
390  {
392  for (int i = 0; i < g_repeat; i++) {
401  }
402 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
void test_array()
Definition: bfloat16_float.cpp:323
void test_nextafter()
Definition: bfloat16_float.cpp:356
void test_arithmetic()
Definition: bfloat16_float.cpp:206
void test_basic_functions()
Definition: bfloat16_float.cpp:253
void test_comparison()
Definition: bfloat16_float.cpp:216
void test_trigonometric_functions()
Definition: bfloat16_float.cpp:300
void test_numtraits()
Definition: bfloat16_float.cpp:162
void test_product()
Definition: bfloat16_float.cpp:342
void test_conversion()
Definition: bfloat16_float.cpp:46
#define CALL_SUBTEST(FUNC)
Definition: main.h:382
static int g_repeat
Definition: main.h:191

References CALL_SUBTEST, Eigen::g_repeat, i, test_arithmetic(), test_array(), test_basic_functions(), test_comparison(), test_conversion(), test_nextafter(), test_numtraits(), test_product(), and test_trigonometric_functions().

◆ test_arithmetic()

void test_arithmetic ( )
206  {
207  VERIFY_IS_EQUAL(static_cast<float>(bfloat16(2) + bfloat16(2)), 4.f);
208  VERIFY_IS_EQUAL(static_cast<float>(bfloat16(2) + bfloat16(-2)), 0.f);
209  VERIFY_IS_APPROX(static_cast<float>(bfloat16(0.33333f) + bfloat16(0.66667f)), 1.0f);
210  VERIFY_IS_EQUAL(static_cast<float>(bfloat16(2.0f) * bfloat16(-5.5f)), -11.0f);
211  VERIFY_IS_APPROX(static_cast<float>(bfloat16(1.0f) / bfloat16(3.0f)), 0.3339f);
212  VERIFY_IS_EQUAL(static_cast<float>(-bfloat16(4096.0f)), -4096.0f);
213  VERIFY_IS_EQUAL(static_cast<float>(-bfloat16(-4096.0f)), 4096.0f);
214 }
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
Definition: BFloat16.h:101

References VERIFY_IS_APPROX, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_array()

void test_array ( )
323  {
324  typedef Array<bfloat16, 1, Dynamic> ArrayXh;
325  Index size = internal::random<Index>(1, 10);
326  Index i = internal::random<Index>(0, size - 1);
327  ArrayXh a1 = ArrayXh::Random(size), a2 = ArrayXh::Random(size);
328  VERIFY_IS_APPROX(a1 + a1, bfloat16(2) * a1);
329  VERIFY((a1.abs() >= bfloat16(0)).all());
330  VERIFY_IS_APPROX((a1 * a1).sqrt(), a1.abs());
331 
332  VERIFY(((a1.min)(a2) <= (a1.max)(a2)).all());
333  a1(i) = bfloat16(-10.);
334  VERIFY_IS_EQUAL(a1.minCoeff(), bfloat16(-10.));
335  a1(i) = bfloat16(10.);
336  VERIFY_IS_EQUAL(a1.maxCoeff(), bfloat16(10.));
337 
338  std::stringstream ss;
339  ss << a1;
340 }
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
General-purpose arrays with easy API for coefficient-wise operations.
Definition: Array.h:48
static constexpr Eigen::internal::all_t all
Definition: IndexedViewHelper.h:86
#define VERIFY(a)
Definition: main.h:362
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83

References Eigen::placeholders::all, i, size, sqrt(), VERIFY, VERIFY_IS_APPROX, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_basic_functions()

void test_basic_functions ( )
253  {
254  VERIFY_IS_EQUAL(static_cast<float>(numext::abs(bfloat16(3.5f))), 3.5f);
255  VERIFY_IS_EQUAL(static_cast<float>(abs(bfloat16(3.5f))), 3.5f);
256  VERIFY_IS_EQUAL(static_cast<float>(numext::abs(bfloat16(-3.5f))), 3.5f);
257  VERIFY_IS_EQUAL(static_cast<float>(abs(bfloat16(-3.5f))), 3.5f);
258 
259  VERIFY_IS_EQUAL(static_cast<float>(numext::floor(bfloat16(3.5f))), 3.0f);
260  VERIFY_IS_EQUAL(static_cast<float>(floor(bfloat16(3.5f))), 3.0f);
261  VERIFY_IS_EQUAL(static_cast<float>(numext::floor(bfloat16(-3.5f))), -4.0f);
262  VERIFY_IS_EQUAL(static_cast<float>(floor(bfloat16(-3.5f))), -4.0f);
263 
264  VERIFY_IS_EQUAL(static_cast<float>(numext::ceil(bfloat16(3.5f))), 4.0f);
265  VERIFY_IS_EQUAL(static_cast<float>(ceil(bfloat16(3.5f))), 4.0f);
266  VERIFY_IS_EQUAL(static_cast<float>(numext::ceil(bfloat16(-3.5f))), -3.0f);
267  VERIFY_IS_EQUAL(static_cast<float>(ceil(bfloat16(-3.5f))), -3.0f);
268 
269  VERIFY_IS_APPROX(static_cast<float>(numext::sqrt(bfloat16(0.0f))), 0.0f);
270  VERIFY_IS_APPROX(static_cast<float>(sqrt(bfloat16(0.0f))), 0.0f);
271  VERIFY_IS_APPROX(static_cast<float>(numext::sqrt(bfloat16(4.0f))), 2.0f);
272  VERIFY_IS_APPROX(static_cast<float>(sqrt(bfloat16(4.0f))), 2.0f);
273 
274  VERIFY_IS_APPROX(static_cast<float>(numext::pow(bfloat16(0.0f), bfloat16(1.0f))), 0.0f);
275  VERIFY_IS_APPROX(static_cast<float>(pow(bfloat16(0.0f), bfloat16(1.0f))), 0.0f);
276  VERIFY_IS_APPROX(static_cast<float>(numext::pow(bfloat16(2.0f), bfloat16(2.0f))), 4.0f);
277  VERIFY_IS_APPROX(static_cast<float>(pow(bfloat16(2.0f), bfloat16(2.0f))), 4.0f);
278 
279  VERIFY_IS_EQUAL(static_cast<float>(numext::exp(bfloat16(0.0f))), 1.0f);
280  VERIFY_IS_EQUAL(static_cast<float>(exp(bfloat16(0.0f))), 1.0f);
281  VERIFY_IS_APPROX(static_cast<float>(numext::exp(bfloat16(EIGEN_PI))), 20.f + static_cast<float>(EIGEN_PI));
282  VERIFY_IS_APPROX(static_cast<float>(exp(bfloat16(EIGEN_PI))), 20.f + static_cast<float>(EIGEN_PI));
283 
284  VERIFY_IS_EQUAL(static_cast<float>(numext::expm1(bfloat16(0.0f))), 0.0f);
285  VERIFY_IS_EQUAL(static_cast<float>(expm1(bfloat16(0.0f))), 0.0f);
286  VERIFY_IS_APPROX(static_cast<float>(numext::expm1(bfloat16(2.0f))), 6.375f);
287  VERIFY_IS_APPROX(static_cast<float>(expm1(bfloat16(2.0f))), 6.375f);
288 
289  VERIFY_IS_EQUAL(static_cast<float>(numext::log(bfloat16(1.0f))), 0.0f);
290  VERIFY_IS_EQUAL(static_cast<float>(log(bfloat16(1.0f))), 0.0f);
291  VERIFY_IS_APPROX(static_cast<float>(numext::log(bfloat16(10.0f))), 2.296875f);
292  VERIFY_IS_APPROX(static_cast<float>(log(bfloat16(10.0f))), 2.296875f);
293 
294  VERIFY_IS_EQUAL(static_cast<float>(numext::log1p(bfloat16(0.0f))), 0.0f);
295  VERIFY_IS_EQUAL(static_cast<float>(log1p(bfloat16(0.0f))), 0.0f);
296  VERIFY_IS_APPROX(static_cast<float>(numext::log1p(bfloat16(10.0f))), 2.390625f);
297  VERIFY_IS_APPROX(static_cast<float>(log1p(bfloat16(10.0f))), 2.390625f);
298 }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
#define EIGEN_PI
Definition: MathFunctions.h:16
EIGEN_DEVICE_FUNC const GlobalUnaryPowReturnType< Derived, ScalarExponent > pow(const Eigen::ArrayBase< Derived > &x, const ScalarExponent &exponent)
Definition: GlobalFunctions.h:137
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 floor(const bfloat16 &a)
Definition: BFloat16.h:643
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 ceil(const bfloat16 &a)
Definition: BFloat16.h:644
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 exp(const bfloat16 &a)
Definition: BFloat16.h:615
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 pow(const bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:625
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 expm1(const bfloat16 &a)
Definition: BFloat16.h:617
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16 &a)
Definition: BFloat16.h:618
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log1p(const bfloat16 &a)
Definition: BFloat16.h:619

References abs(), Eigen::bfloat16_impl::ceil(), EIGEN_PI, Eigen::bfloat16_impl::exp(), Eigen::bfloat16_impl::expm1(), Eigen::bfloat16_impl::floor(), Eigen::bfloat16_impl::log(), Eigen::bfloat16_impl::log1p(), Eigen::bfloat16_impl::pow(), Eigen::ArrayBase< Derived >::pow(), sqrt(), VERIFY_IS_APPROX, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_comparison()

void test_comparison ( )
216  {
217  VERIFY(bfloat16(1.0f) > bfloat16(0.5f));
218  VERIFY(bfloat16(0.5f) < bfloat16(1.0f));
219  VERIFY(!(bfloat16(1.0f) < bfloat16(0.5f)));
220  VERIFY(!(bfloat16(0.5f) > bfloat16(1.0f)));
221 
222  VERIFY(!(bfloat16(4.0f) > bfloat16(4.0f)));
223  VERIFY(!(bfloat16(4.0f) < bfloat16(4.0f)));
224 
225  VERIFY(!(bfloat16(0.0f) < bfloat16(-0.0f)));
226  VERIFY(!(bfloat16(-0.0f) < bfloat16(0.0f)));
227  VERIFY(!(bfloat16(0.0f) > bfloat16(-0.0f)));
228  VERIFY(!(bfloat16(-0.0f) > bfloat16(0.0f)));
229 
230  VERIFY(bfloat16(0.2f) > bfloat16(-1.0f));
231  VERIFY(bfloat16(-1.0f) < bfloat16(0.2f));
232  VERIFY(bfloat16(-16.0f) < bfloat16(-15.0f));
233 
234  VERIFY(bfloat16(1.0f) == bfloat16(1.0f));
235  VERIFY(bfloat16(1.0f) != bfloat16(2.0f));
236 
237  // Comparisons with NaNs and infinities.
238 #if !EIGEN_COMP_MSVC
239  // Visual Studio errors out on divisions by 0
240  VERIFY(!(bfloat16(0.0 / 0.0) == bfloat16(0.0 / 0.0)));
241  VERIFY(bfloat16(0.0 / 0.0) != bfloat16(0.0 / 0.0));
242 
243  VERIFY(!(bfloat16(1.0) == bfloat16(0.0 / 0.0)));
244  VERIFY(!(bfloat16(1.0) < bfloat16(0.0 / 0.0)));
245  VERIFY(!(bfloat16(1.0) > bfloat16(0.0 / 0.0)));
246  VERIFY(bfloat16(1.0) != bfloat16(0.0 / 0.0));
247 
248  VERIFY(bfloat16(1.0) < bfloat16(1.0 / 0.0));
249  VERIFY(bfloat16(1.0) > bfloat16(-1.0 / 0.0));
250 #endif
251 }

References VERIFY.

Referenced by EIGEN_DECLARE_TEST().

◆ test_conversion()

void test_conversion ( )
46  {
48 
49  // Round-trip casts
50  VERIFY_IS_EQUAL(numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(1.0f))), bfloat16(1.0f));
51  VERIFY_IS_EQUAL(numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(0.5f))), bfloat16(0.5f));
52  VERIFY_IS_EQUAL(numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(-0.33333f))),
53  bfloat16(-0.33333f));
54  VERIFY_IS_EQUAL(numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(0.0f))), bfloat16(0.0f));
55 
56  // Conversion from float.
57  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(1.0f), 0x3f80);
58  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.5f), 0x3f00);
59  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.33333f), 0x3eab);
60  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(3.38e38f), 0x7f7e);
61  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(3.40e38f), 0x7f80); // Becomes infinity.
62 
63  // Verify round-to-nearest-even behavior.
64  float val1 = static_cast<float>(bfloat16(__bfloat16_raw(0x3c00)));
65  float val2 = static_cast<float>(bfloat16(__bfloat16_raw(0x3c01)));
66  float val3 = static_cast<float>(bfloat16(__bfloat16_raw(0x3c02)));
67  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.5f * (val1 + val2)), 0x3c00);
68  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.5f * (val2 + val3)), 0x3c02);
69 
70  // Conversion from int.
77 
78  // Conversion from bool.
79  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(false), 0x0000);
80  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(true), 0x3f80);
81 
82  // Conversion to bool
83  VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(3)), true);
84  VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(0.33333f)), true);
85  VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(-0.0)), false);
86  VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(0.0)), false);
87 
88  // Explicit conversion to float.
89  VERIFY_IS_EQUAL(static_cast<float>(bfloat16(__bfloat16_raw(0x0000))), 0.0f);
90  VERIFY_IS_EQUAL(static_cast<float>(bfloat16(__bfloat16_raw(0x3f80))), 1.0f);
91 
92  // Implicit conversion to float
93  VERIFY_IS_EQUAL(bfloat16(__bfloat16_raw(0x0000)), 0.0f);
94  VERIFY_IS_EQUAL(bfloat16(__bfloat16_raw(0x3f80)), 1.0f);
95 
96  // Zero representations
97  VERIFY_IS_EQUAL(bfloat16(0.0f), bfloat16(0.0f));
98  VERIFY_IS_EQUAL(bfloat16(-0.0f), bfloat16(0.0f));
99  VERIFY_IS_EQUAL(bfloat16(-0.0f), bfloat16(-0.0f));
100  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.0f), 0x0000);
101  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(-0.0f), 0x8000);
102 
103  // Default is zero
104  VERIFY_IS_EQUAL(static_cast<float>(bfloat16()), 0.0f);
105 
106  // Representable floats round trip via bfloat16
107  test_roundtrip<float>();
108  test_roundtrip<double>();
109  test_roundtrip<std::complex<float> >();
110  test_roundtrip<std::complex<double> >();
111 
112  // Conversion
114  for (int i = 0; i < 100; i++) a(i) = i + 1.25;
116  Array<float, 1, 100> c = b.cast<float>();
117  for (int i = 0; i < 100; ++i) {
118  VERIFY_LE(numext::abs(c(i) - a(i)), a(i) / 128);
119  }
120 
121  // Epsilon
122  VERIFY_LE(1.0f, static_cast<float>((std::numeric_limits<bfloat16>::epsilon)() + bfloat16(1.0f)));
123  VERIFY_IS_EQUAL(1.0f,
124  static_cast<float>((std::numeric_limits<bfloat16>::epsilon)() / bfloat16(2.0f) + bfloat16(1.0f)));
125 
126  // Negate
127  VERIFY_IS_EQUAL(static_cast<float>(-bfloat16(3.0f)), -3.0f);
128  VERIFY_IS_EQUAL(static_cast<float>(-bfloat16(-4.5f)), 4.5f);
129 
130 #if !EIGEN_COMP_MSVC
131  // Visual Studio errors out on divisions by 0
132  VERIFY((numext::isnan)(static_cast<float>(bfloat16(0.0 / 0.0))));
133  VERIFY((numext::isinf)(static_cast<float>(bfloat16(1.0 / 0.0))));
134  VERIFY((numext::isinf)(static_cast<float>(bfloat16(-1.0 / 0.0))));
135 
136  // Visual Studio errors out on divisions by 0
137  VERIFY((numext::isnan)(bfloat16(0.0 / 0.0)));
138  VERIFY((numext::isinf)(bfloat16(1.0 / 0.0)));
139  VERIFY((numext::isinf)(bfloat16(-1.0 / 0.0)));
140 #endif
141 
142  // NaNs and infinities.
143  VERIFY(!(numext::isinf)(static_cast<float>(bfloat16(3.38e38f)))); // Largest finite number.
144  VERIFY(!(numext::isnan)(static_cast<float>(bfloat16(0.0f))));
145  VERIFY((numext::isinf)(static_cast<float>(bfloat16(__bfloat16_raw(0xff80)))));
146  VERIFY((numext::isnan)(static_cast<float>(bfloat16(__bfloat16_raw(0xffc0)))));
147  VERIFY((numext::isinf)(static_cast<float>(bfloat16(__bfloat16_raw(0x7f80)))));
148  VERIFY((numext::isnan)(static_cast<float>(bfloat16(__bfloat16_raw(0x7fc0)))));
149 
150  // Exactly same checks as above, just directly on the bfloat16 representation.
151  VERIFY(!(numext::isinf)(bfloat16(__bfloat16_raw(0x7bff))));
152  VERIFY(!(numext::isnan)(bfloat16(__bfloat16_raw(0x0000))));
153  VERIFY((numext::isinf)(bfloat16(__bfloat16_raw(0xff80))));
154  VERIFY((numext::isnan)(bfloat16(__bfloat16_raw(0xffc0))));
155  VERIFY((numext::isinf)(bfloat16(__bfloat16_raw(0x7f80))));
156  VERIFY((numext::isnan)(bfloat16(__bfloat16_raw(0x7fc0))));
157 
158  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(BinaryToFloat(0x0, 0xff, 0x40, 0x0)), 0x7fc0);
159  VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(BinaryToFloat(0x1, 0xff, 0x40, 0x0)), 0xffc0);
160 }
Scalar * b
Definition: benchVecAdd.cpp:17
#define VERIFY_BFLOAT16_BITS_EQUAL(h, bits)
Definition: bfloat16_float.cpp:14
float BinaryToFloat(uint32_t sign, uint32_t exponent, uint32_t high_mantissa, uint32_t low_mantissa)
Definition: bfloat16_float.cpp:24
const Scalar * a
Definition: level2_cplx_impl.h:32
#define VERIFY_LE(a, b)
Definition: main.h:365
#define isnan(X)
Definition: main.h:109
#define isinf(X)
Definition: main.h:110
int c
Definition: calibrate.py:100
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
Definition: BFloat16.h:70

References a, abs(), b, BinaryToFloat(), calibrate::c, oomph::SarahBL::epsilon, i, isinf, isnan, VERIFY, VERIFY_BFLOAT16_BITS_EQUAL, VERIFY_IS_EQUAL, and VERIFY_LE.

Referenced by EIGEN_DECLARE_TEST().

◆ test_nextafter()

void test_nextafter ( )
356  {
357  VERIFY((numext::isnan)(numext::nextafter(std::numeric_limits<bfloat16>::quiet_NaN(), bfloat16(1.0f))));
358  VERIFY((numext::isnan)(numext::nextafter(bfloat16(1.0f), std::numeric_limits<bfloat16>::quiet_NaN())));
359  VERIFY(numext::nextafter(bfloat16(0.0f), bfloat16(0.0f)) == bfloat16(0.0f));
360  VERIFY(numext::nextafter(bfloat16(1.0f), bfloat16(1.0f)) == bfloat16(1.0f));
361  VERIFY(numext::nextafter(bfloat16(-1.0f), bfloat16(-1.0f)) == bfloat16(-1.0f));
362  VERIFY(numext::nextafter(std::numeric_limits<bfloat16>::infinity(), std::numeric_limits<bfloat16>::infinity()) ==
363  std::numeric_limits<bfloat16>::infinity());
364  VERIFY(numext::nextafter(std::numeric_limits<bfloat16>::infinity(), bfloat16(0.0f)) ==
366  VERIFY(numext::nextafter(-std::numeric_limits<bfloat16>::infinity(), bfloat16(0.0f)) ==
368  VERIFY(numext::nextafter(bfloat16(1.0f), std::numeric_limits<bfloat16>::infinity()) ==
370  VERIFY(numext::nextafter(bfloat16(1.0f), -std::numeric_limits<bfloat16>::infinity()) ==
372  VERIFY(numext::nextafter(bfloat16(-1.0f), -std::numeric_limits<bfloat16>::infinity()) ==
374  VERIFY(numext::nextafter(bfloat16(-1.0f), std::numeric_limits<bfloat16>::infinity()) ==
376  VERIFY(numext::nextafter((std::numeric_limits<bfloat16>::max)(), std::numeric_limits<bfloat16>::infinity()) ==
377  std::numeric_limits<bfloat16>::infinity());
378  VERIFY(numext::nextafter(-(std::numeric_limits<bfloat16>::max)(), -std::numeric_limits<bfloat16>::infinity()) ==
379  -std::numeric_limits<bfloat16>::infinity());
388 }
#define max(a, b)
Definition: datatypes.h:23
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 nextafter(const bfloat16 &from, const bfloat16 &to)
Definition: BFloat16.h:766

References oomph::SarahBL::epsilon, isnan, max, Eigen::numext::nextafter(), VERIFY, and VERIFY_BFLOAT16_BITS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_numtraits()

void test_numtraits ( )
162  {
163  std::cout << "epsilon = " << NumTraits<bfloat16>::epsilon() << " (0x" << std::hex
164  << numext::bit_cast<numext::uint16_t>(NumTraits<bfloat16>::epsilon()) << ")" << std::endl;
165  std::cout << "highest = " << NumTraits<bfloat16>::highest() << " (0x" << std::hex
166  << numext::bit_cast<numext::uint16_t>(NumTraits<bfloat16>::highest()) << ")" << std::endl;
167  std::cout << "lowest = " << NumTraits<bfloat16>::lowest() << " (0x" << std::hex
168  << numext::bit_cast<numext::uint16_t>(NumTraits<bfloat16>::lowest()) << ")" << std::endl;
169  std::cout << "min = " << (std::numeric_limits<bfloat16>::min)() << " (0x" << std::hex
170  << numext::bit_cast<numext::uint16_t>((std::numeric_limits<bfloat16>::min)()) << ")" << std::endl;
171  std::cout << "denorm min = " << (std::numeric_limits<bfloat16>::denorm_min)() << " (0x" << std::hex
172  << numext::bit_cast<numext::uint16_t>((std::numeric_limits<bfloat16>::denorm_min)()) << ")" << std::endl;
173  std::cout << "infinity = " << NumTraits<bfloat16>::infinity() << " (0x" << std::hex
174  << numext::bit_cast<numext::uint16_t>(NumTraits<bfloat16>::infinity()) << ")" << std::endl;
175  std::cout << "quiet nan = " << NumTraits<bfloat16>::quiet_NaN() << " (0x" << std::hex
176  << numext::bit_cast<numext::uint16_t>(NumTraits<bfloat16>::quiet_NaN()) << ")" << std::endl;
177  std::cout << "signaling nan = " << std::numeric_limits<bfloat16>::signaling_NaN() << " (0x" << std::hex
178  << numext::bit_cast<numext::uint16_t>(std::numeric_limits<bfloat16>::signaling_NaN()) << ")" << std::endl;
179 
181 
182  VERIFY_IS_EQUAL(numext::bit_cast<numext::uint16_t>(std::numeric_limits<bfloat16>::infinity()),
183  numext::bit_cast<numext::uint16_t>(bfloat16(std::numeric_limits<float>::infinity())));
184  // There is no guarantee that casting a 32-bit NaN to bfloat16 has a precise
185  // bit pattern. We test that it is in fact a NaN, then test the signaling
186  // bit (msb of significand is 1 for quiet, 0 for signaling).
187  const numext::uint16_t BFLOAT16_QUIET_BIT = 0x0040;
188  VERIFY((numext::isnan)(std::numeric_limits<bfloat16>::quiet_NaN()) &&
189  (numext::isnan)(bfloat16(std::numeric_limits<float>::quiet_NaN())) &&
190  ((numext::bit_cast<numext::uint16_t>(std::numeric_limits<bfloat16>::quiet_NaN()) & BFLOAT16_QUIET_BIT) > 0) &&
191  ((numext::bit_cast<numext::uint16_t>(bfloat16(std::numeric_limits<float>::quiet_NaN())) & BFLOAT16_QUIET_BIT) >
192  0));
193  // After a cast to bfloat16, a signaling NaN may become non-signaling. Thus,
194  // we check that both are NaN, and that only the `numeric_limits` version is
195  // signaling.
196  VERIFY(
197  (numext::isnan)(std::numeric_limits<bfloat16>::signaling_NaN()) &&
198  (numext::isnan)(bfloat16(std::numeric_limits<float>::signaling_NaN())) &&
199  ((numext::bit_cast<numext::uint16_t>(std::numeric_limits<bfloat16>::signaling_NaN()) & BFLOAT16_QUIET_BIT) == 0));
200 
202  VERIFY((std::numeric_limits<bfloat16>::denorm_min)() > bfloat16(0.f));
203  VERIFY_IS_EQUAL((std::numeric_limits<bfloat16>::denorm_min)() / bfloat16(2), bfloat16(0.f));
204 }
#define min(a, b)
Definition: datatypes.h:22
std::uint16_t uint16_t
Definition: Meta.h:38
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217

References oomph::SarahBL::epsilon, isnan, min, VERIFY, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_product()

void test_product ( )
342  {
343  typedef Matrix<bfloat16, Dynamic, Dynamic> MatrixXh;
344  Index rows = internal::random<Index>(1, EIGEN_TEST_MAX_SIZE);
345  Index cols = internal::random<Index>(1, EIGEN_TEST_MAX_SIZE);
346  Index depth = internal::random<Index>(1, EIGEN_TEST_MAX_SIZE);
347  MatrixXh Ah = MatrixXh::Random(rows, depth);
348  MatrixXh Bh = MatrixXh::Random(depth, cols);
349  MatrixXh Ch = MatrixXh::Random(rows, cols);
350  MatrixXf Af = Ah.cast<float>();
351  MatrixXf Bf = Bh.cast<float>();
352  MatrixXf Cf = Ch.cast<float>();
353  VERIFY_IS_APPROX(Ch.noalias() += Ah * Bh, (Cf.noalias() += Af * Bf).cast<bfloat16>());
354 }
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
#define EIGEN_TEST_MAX_SIZE
Definition: boostmultiprec.cpp:16
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186

References cols, EIGEN_TEST_MAX_SIZE, rows, and VERIFY_IS_APPROX.

Referenced by EIGEN_DECLARE_TEST().

◆ test_roundtrip()

template<typename T >
void test_roundtrip ( )
32  {
33  // Representable T round trip via bfloat16
34  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(-std::numeric_limits<T>::infinity()))),
35  -std::numeric_limits<T>::infinity());
36  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(std::numeric_limits<T>::infinity()))),
37  std::numeric_limits<T>::infinity());
38  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(T(-1.0)))), T(-1.0));
39  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(T(-0.5)))), T(-0.5));
40  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(T(-0.0)))), T(-0.0));
41  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(T(1.0)))), T(1.0));
42  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(T(0.5)))), T(0.5));
43  VERIFY_IS_EQUAL((internal::cast<bfloat16, T>(internal::cast<T, bfloat16>(T(0.0)))), T(0.0));
44 }
Eigen::Triplet< double > T
Definition: EigenUnitTest.cpp:11

References VERIFY_IS_EQUAL.

◆ test_trigonometric_functions()

void test_trigonometric_functions ( )
300  {
301  VERIFY_IS_APPROX(numext::cos(bfloat16(0.0f)), bfloat16(cosf(0.0f)));
302  VERIFY_IS_APPROX(cos(bfloat16(0.0f)), bfloat16(cosf(0.0f)));
304  // VERIFY_IS_APPROX(numext::cos(bfloat16(EIGEN_PI/2)), bfloat16(cosf(EIGEN_PI/2)));
305  // VERIFY_IS_APPROX(numext::cos(bfloat16(3*EIGEN_PI/2)), bfloat16(cosf(3*EIGEN_PI/2)));
306  VERIFY_IS_APPROX(numext::cos(bfloat16(3.5f)), bfloat16(cosf(3.5f)));
307 
308  VERIFY_IS_APPROX(numext::sin(bfloat16(0.0f)), bfloat16(sinf(0.0f)));
309  VERIFY_IS_APPROX(sin(bfloat16(0.0f)), bfloat16(sinf(0.0f)));
310  // VERIFY_IS_APPROX(numext::sin(bfloat16(EIGEN_PI)), bfloat16(sinf(EIGEN_PI)));
312  VERIFY_IS_APPROX(numext::sin(bfloat16(3 * EIGEN_PI / 2)), bfloat16(sinf(3 * EIGEN_PI / 2)));
313  VERIFY_IS_APPROX(numext::sin(bfloat16(3.5f)), bfloat16(sinf(3.5f)));
314 
315  VERIFY_IS_APPROX(numext::tan(bfloat16(0.0f)), bfloat16(tanf(0.0f)));
316  VERIFY_IS_APPROX(tan(bfloat16(0.0f)), bfloat16(tanf(0.0f)));
317  // VERIFY_IS_APPROX(numext::tan(bfloat16(EIGEN_PI)), bfloat16(tanf(EIGEN_PI)));
318  // VERIFY_IS_APPROX(numext::tan(bfloat16(EIGEN_PI/2)), bfloat16(tanf(EIGEN_PI/2)));
319  // VERIFY_IS_APPROX(numext::tan(bfloat16(3*EIGEN_PI/2)), bfloat16(tanf(3*EIGEN_PI/2)));
320  VERIFY_IS_APPROX(numext::tan(bfloat16(3.5f)), bfloat16(tanf(3.5f)));
321 }
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 tan(const bfloat16 &a)
Definition: BFloat16.h:633

References cos(), EIGEN_PI, sin(), Eigen::bfloat16_impl::tan(), and VERIFY_IS_APPROX.

Referenced by EIGEN_DECLARE_TEST().