///////////////////////////////////////////////////// CORE CONVERSION
| 173 | // CORE CONVERSION |
| 174 | // |
| 175 | float float16::f16tof32(uint16_t _value) const |
| 176 | { |
| 177 | uint16_t sgn, man; |
| 178 | int exp; |
| 179 | double f; |
| 180 | |
| 181 | sgn = (_value & 0x8000) > 0; |
| 182 | exp = (_value & 0x7C00) >> 10; |
| 183 | man = (_value & 0x03FF); |
| 184 | |
| 185 | // ZERO |
| 186 | if ((_value & 0x7FFF) == 0) |
| 187 | { |
| 188 | return sgn ? -0 : 0; |
| 189 | } |
| 190 | // NAN & INF |
| 191 | if (exp == 0x001F) |
| 192 | { |
| 193 | if (man == 0) return sgn ? -INFINITY : INFINITY; |
| 194 | else return NAN; |
| 195 | } |
| 196 | |
| 197 | // SUBNORMAL/NORMAL |
| 198 | if (exp == 0) f = 0; |
| 199 | else f = 1; |
| 200 | |
| 201 | // PROCESS MANTISSE |
| 202 | for (int i = 9; i >= 0; i--) |
| 203 | { |
| 204 | f *= 2; |
| 205 | if (man & (1 << i)) f = f + 1; |
| 206 | } |
| 207 | f = f * pow(2.0, exp - 25); |
| 208 | if (exp == 0) |
| 209 | { |
| 210 | f = f * pow(2.0, -13); // 5.96046447754e-8; |
| 211 | } |
| 212 | return sgn ? -f : f; |
| 213 | } |
| 214 | |
| 215 | uint16_t float16::f32tof16(float f) const |
| 216 | { |