| 19 | using Eigen::half; |
| 20 | |
| 21 | void test_conversion() |
| 22 | { |
| 23 | using Eigen::half_impl::__half; |
| 24 | |
| 25 | // Conversion from float. |
| 26 | VERIFY_IS_EQUAL(half(1.0f).x, 0x3c00); |
| 27 | VERIFY_IS_EQUAL(half(0.5f).x, 0x3800); |
| 28 | VERIFY_IS_EQUAL(half(0.33333f).x, 0x3555); |
| 29 | VERIFY_IS_EQUAL(half(0.0f).x, 0x0000); |
| 30 | VERIFY_IS_EQUAL(half(-0.0f).x, 0x8000); |
| 31 | VERIFY_IS_EQUAL(half(65504.0f).x, 0x7bff); |
| 32 | VERIFY_IS_EQUAL(half(65536.0f).x, 0x7c00); // Becomes infinity. |
| 33 | |
| 34 | // Denormals. |
| 35 | VERIFY_IS_EQUAL(half(-5.96046e-08f).x, 0x8001); |
| 36 | VERIFY_IS_EQUAL(half(5.96046e-08f).x, 0x0001); |
| 37 | VERIFY_IS_EQUAL(half(1.19209e-07f).x, 0x0002); |
| 38 | |
| 39 | // Verify round-to-nearest-even behavior. |
| 40 | float val1 = float(half(__half(0x3c00))); |
| 41 | float val2 = float(half(__half(0x3c01))); |
| 42 | float val3 = float(half(__half(0x3c02))); |
| 43 | VERIFY_IS_EQUAL(half(0.5f * (val1 + val2)).x, 0x3c00); |
| 44 | VERIFY_IS_EQUAL(half(0.5f * (val2 + val3)).x, 0x3c02); |
| 45 | |
| 46 | // Conversion from int. |
| 47 | VERIFY_IS_EQUAL(half(-1).x, 0xbc00); |
| 48 | VERIFY_IS_EQUAL(half(0).x, 0x0000); |
| 49 | VERIFY_IS_EQUAL(half(1).x, 0x3c00); |
| 50 | VERIFY_IS_EQUAL(half(2).x, 0x4000); |
| 51 | VERIFY_IS_EQUAL(half(3).x, 0x4200); |
| 52 | |
| 53 | // Conversion from bool. |
| 54 | VERIFY_IS_EQUAL(half(false).x, 0x0000); |
| 55 | VERIFY_IS_EQUAL(half(true).x, 0x3c00); |
| 56 | |
| 57 | // Conversion to float. |
| 58 | VERIFY_IS_EQUAL(float(half(__half(0x0000))), 0.0f); |
| 59 | VERIFY_IS_EQUAL(float(half(__half(0x3c00))), 1.0f); |
| 60 | |
| 61 | // Denormals. |
| 62 | VERIFY_IS_APPROX(float(half(__half(0x8001))), -5.96046e-08f); |
| 63 | VERIFY_IS_APPROX(float(half(__half(0x0001))), 5.96046e-08f); |
| 64 | VERIFY_IS_APPROX(float(half(__half(0x0002))), 1.19209e-07f); |
| 65 | |
| 66 | // NaNs and infinities. |
| 67 | VERIFY(!(numext::isinf)(float(half(65504.0f)))); // Largest finite number. |
| 68 | VERIFY(!(numext::isnan)(float(half(0.0f)))); |
| 69 | VERIFY((numext::isinf)(float(half(__half(0xfc00))))); |
| 70 | VERIFY((numext::isnan)(float(half(__half(0xfc01))))); |
| 71 | VERIFY((numext::isinf)(float(half(__half(0x7c00))))); |
| 72 | VERIFY((numext::isnan)(float(half(__half(0x7c01))))); |
| 73 | |
| 74 | #if !EIGEN_COMP_MSVC |
| 75 | // Visual Studio errors out on divisions by 0 |
| 76 | VERIFY((numext::isnan)(float(half(0.0 / 0.0)))); |
| 77 | VERIFY((numext::isinf)(float(half(1.0 / 0.0)))); |
| 78 | VERIFY((numext::isinf)(float(half(-1.0 / 0.0)))); |
no test coverage detected