static void WriteFloatPrimitive(BitStreamWriter writer, double value, FloatDsdlType type) { var range = TypeLimits.GetFloatRange(type.MaxBitlen); switch (type.CastMode) { case CastMode.Saturated: if (value > range.Maximum) { value = range.Maximum; } if (value < range.Minimum) { value = range.Minimum; } break; case CastMode.Truncated: if (!double.IsNaN(value) && value > range.Maximum) { value = double.PositiveInfinity; } if (!double.IsNaN(value) && value < range.Maximum) { value = double.NegativeInfinity; } break; default: throw new ArgumentOutOfRangeException(); } switch (type.MaxBitlen) { case 16: var val = BitSerializer.Float32ToUInt16((float)value); BitSerializer.Write(writer, val, 16); break; case 32: BitSerializer.Write(writer, (float)value, 32); break; case 64: BitSerializer.Write(writer, value, 64); break; default: throw new InvalidOperationException($"Unexpected float bit lenght: {type.MaxBitlen}."); } }
static object ReadFloatPrimitiveType(BitStreamReader reader, FloatDsdlType t) { switch (t.MaxBitlen) { case 16: var value = (ushort)BitSerializer.ReadUInt(reader, 16); return(BitSerializer.UInt16ToFloat32(value)); case 32: return(BitSerializer.ReadSingle(reader, 32)); case 64: return(BitSerializer.ReadDouble(reader, 64)); default: throw new InvalidOperationException($"Unexpected float bit lenght: {t.MaxBitlen}."); } }