19 {
20 const uint32_t bits = std::bit_cast<uint32_t>(value);
21 const uint32_t sign = (bits >> 16U) & 0x8000U;
22 int32_t exponent = static_cast<int32_t>((bits >> 23U) & 0xFFU) - 127;
23 uint32_t mantissa = bits & 0x7FFFFFU;
24 if (exponent < -24) {
25 return static_cast<uint16_t>(sign);
26 }
27 if (exponent < -14) {
28 mantissa |= 0x800000U;
29 const uint32_t shift = static_cast<uint32_t>(-exponent - 14);
30 const uint32_t rounded = (mantissa + (1U << (shift + 12U))) >> (shift + 13U);
31 return static_cast<uint16_t>(sign | rounded);
32 }
33 if (exponent > 15) {
34 return static_cast<uint16_t>(sign | 0x7C00U);
35 }
36 uint32_t half_exponent = static_cast<uint32_t>(exponent + 15);
37 mantissa += 0x1000U;
38 if ((mantissa & 0x800000U) != 0U) {
39 mantissa = 0U;
40 ++half_exponent;
41 }
42 if (half_exponent >= 31U) {
43 return static_cast<uint16_t>(sign | 0x7C00U);
44 }
45 return static_cast<uint16_t>(sign | (half_exponent << 10U) | (mantissa >> 13U));
46 }