mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
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.
This commit is contained in:
committed by
Rasmus Munk Larsen
parent
2ce2f51989
commit
c1ffe452fc
@@ -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<bool>(bfloat16(3)), true);
|
||||
VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(0.33333f)), true);
|
||||
VERIFY_IS_EQUAL(bfloat16(-0.0), false);
|
||||
VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(0.0)), false);
|
||||
|
||||
// Explicit conversion to float.
|
||||
VERIFY_IS_EQUAL(static_cast<float>(bfloat16(__bfloat16_raw(0x0000))), 0.0f);
|
||||
VERIFY_IS_EQUAL(static_cast<float>(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<float>(bf_trunc), 0.0f);
|
||||
|
||||
// Implicit conversion of denormls to bool is correct
|
||||
VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(denorm)), false);
|
||||
VERIFY_IS_EQUAL(bfloat16(denorm), false);
|
||||
|
||||
if (std::signbit(denorm)) {
|
||||
VERIFY_IS_EQUAL(bf_trunc.value, 0x8000);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user