From c1ffe452fc5b43d7c90fae57b8913497d6c5da0e Mon Sep 17 00:00:00 2001 From: David Tellenbach Date: Thu, 23 Jul 2020 20:55:06 +0000 Subject: Fix bfloat16 casts If we have explicit conversion operators available (C++11) we define explicit casts from bfloat16 to other types. If not (C++03), we don't define conversion operators but rely on implicit conversion chains from bfloat16 over float to other types. --- test/bfloat16_float.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'test/bfloat16_float.cpp') diff --git a/test/bfloat16_float.cpp b/test/bfloat16_float.cpp index 11fc31363..94226e999 100644 --- a/test/bfloat16_float.cpp +++ b/test/bfloat16_float.cpp @@ -84,10 +84,20 @@ void test_conversion() VERIFY_IS_EQUAL(bfloat16(false).value, 0x0000); VERIFY_IS_EQUAL(bfloat16(true).value, 0x3f80); - // Conversion to float. + // Conversion to bool + VERIFY_IS_EQUAL(static_cast(bfloat16(3)), true); + VERIFY_IS_EQUAL(static_cast(bfloat16(0.33333f)), true); + VERIFY_IS_EQUAL(bfloat16(-0.0), false); + VERIFY_IS_EQUAL(static_cast(bfloat16(0.0)), false); + + // Explicit conversion to float. VERIFY_IS_EQUAL(static_cast(bfloat16(__bfloat16_raw(0x0000))), 0.0f); VERIFY_IS_EQUAL(static_cast(bfloat16(__bfloat16_raw(0x3f80))), 1.0f); + // Implicit conversion to float + VERIFY_IS_EQUAL(bfloat16(__bfloat16_raw(0x0000)), 0.0f); + VERIFY_IS_EQUAL(bfloat16(__bfloat16_raw(0x3f80)), 1.0f); + // Zero representations VERIFY_IS_EQUAL(bfloat16(0.0f), bfloat16(0.0f)); VERIFY_IS_EQUAL(bfloat16(-0.0f), bfloat16(0.0f)); @@ -101,6 +111,11 @@ void test_conversion() denorm = nextafterf(denorm, 1.0f)) { bfloat16 bf_trunc = Eigen::bfloat16_impl::truncate_to_bfloat16(denorm); VERIFY_IS_EQUAL(static_cast(bf_trunc), 0.0f); + + // Implicit conversion of denormls to bool is correct + VERIFY_IS_EQUAL(static_cast(bfloat16(denorm)), false); + VERIFY_IS_EQUAL(bfloat16(denorm), false); + if (std::signbit(denorm)) { VERIFY_IS_EQUAL(bf_trunc.value, 0x8000); } else { -- cgit v1.2.3