| 44 | } |
| 45 | |
| 46 | void test_conversion() |
| 47 | { |
| 48 | using Eigen::bfloat16_impl::__bfloat16_raw; |
| 49 | |
| 50 | // Round-trip casts |
| 51 | VERIFY_IS_EQUAL( |
| 52 | numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(1.0f))), |
| 53 | bfloat16(1.0f)); |
| 54 | VERIFY_IS_EQUAL( |
| 55 | numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(0.5f))), |
| 56 | bfloat16(0.5f)); |
| 57 | VERIFY_IS_EQUAL( |
| 58 | numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(-0.33333f))), |
| 59 | bfloat16(-0.33333f)); |
| 60 | VERIFY_IS_EQUAL( |
| 61 | numext::bit_cast<bfloat16>(numext::bit_cast<numext::uint16_t>(bfloat16(0.0f))), |
| 62 | bfloat16(0.0f)); |
| 63 | |
| 64 | // Conversion from float. |
| 65 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(1.0f), 0x3f80); |
| 66 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.5f), 0x3f00); |
| 67 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.33333f), 0x3eab); |
| 68 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(3.38e38f), 0x7f7e); |
| 69 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(3.40e38f), 0x7f80); // Becomes infinity. |
| 70 | |
| 71 | // Verify round-to-nearest-even behavior. |
| 72 | float val1 = static_cast<float>(bfloat16(__bfloat16_raw(0x3c00))); |
| 73 | float val2 = static_cast<float>(bfloat16(__bfloat16_raw(0x3c01))); |
| 74 | float val3 = static_cast<float>(bfloat16(__bfloat16_raw(0x3c02))); |
| 75 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.5f * (val1 + val2)), 0x3c00); |
| 76 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0.5f * (val2 + val3)), 0x3c02); |
| 77 | |
| 78 | // Conversion from int. |
| 79 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(-1), 0xbf80); |
| 80 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(0), 0x0000); |
| 81 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(1), 0x3f80); |
| 82 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(2), 0x4000); |
| 83 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(3), 0x4040); |
| 84 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(12), 0x4140); |
| 85 | |
| 86 | // Conversion from bool. |
| 87 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(false), 0x0000); |
| 88 | VERIFY_BFLOAT16_BITS_EQUAL(bfloat16(true), 0x3f80); |
| 89 | |
| 90 | // Conversion to bool |
| 91 | VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(3)), true); |
| 92 | VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(0.33333f)), true); |
| 93 | VERIFY_IS_EQUAL(bfloat16(-0.0), false); |
| 94 | VERIFY_IS_EQUAL(static_cast<bool>(bfloat16(0.0)), false); |
| 95 | |
| 96 | // Explicit conversion to float. |
| 97 | VERIFY_IS_EQUAL(static_cast<float>(bfloat16(__bfloat16_raw(0x0000))), 0.0f); |
| 98 | VERIFY_IS_EQUAL(static_cast<float>(bfloat16(__bfloat16_raw(0x3f80))), 1.0f); |
| 99 | |
| 100 | // Implicit conversion to float |
| 101 | VERIFY_IS_EQUAL(bfloat16(__bfloat16_raw(0x0000)), 0.0f); |
| 102 | VERIFY_IS_EQUAL(bfloat16(__bfloat16_raw(0x3f80)), 1.0f); |
| 103 |
no test coverage detected