102{
103
104
105
106
107 union {
108 float f;
109 uint32_t u;
110 } v;
111
113
114 uint32_t sign = (v.u >> 16) & 0x8000U;
115 uint32_t mantissa = v.u & 0x7fffffU;
116 int32_t exponent = ((int32_t)((v.u >> 23) & 0xffU)) - 127 + 15;
117
118 if (exponent <= 0)
119 {
120 if (exponent < -10)
121 return (uint16_t)sign;
122
123 mantissa = (mantissa | 0x800000U) >> (uint32_t)(1 - exponent);
124 return (uint16_t)(sign | ((mantissa + 0x1000U) >> 13));
125 }
126
127 if (exponent >= 31)
128 return (uint16_t)(sign | 0x7c00U | (mantissa ? 0x200U : 0));
129
130 return (uint16_t)(sign | ((uint32_t)exponent << 10) | ((mantissa + 0x1000U) >> 13));
131}