/// <summary> /// Unpacks a <see cref="ushort"/> into a <see cref="float"/>. /// </summary> /// <param name="value">The value.</param> /// <returns>The <see cref="float"/>.</returns> internal static float Unpack(ushort value) { uint result; uint mantissa = (uint)(value & 1023); uint exponent = 0xfffffff2; if ((value & -33792) == 0) { if (mantissa != 0) { while ((mantissa & 1024) == 0) { exponent--; mantissa = mantissa << 1; } mantissa &= 0xfffffbff; result = ((uint)((((uint)value & 0x8000) << 16) | ((exponent + 127) << 23))) | (mantissa << 13); } else { result = (uint)((value & 0x8000) << 16); } } else { result = ((((uint)value & 0x8000) << 16) | ((((((uint)value >> 10) & 0x1f) - 15) + 127) << 23)) | (mantissa << 13); } Uif uif = new Uif { U = result }; return(uif.F); }
internal static ushort Pack(float value) { Uif uif = new Uif { F = value }; return(Pack(uif.I)); }