示例#1
0
        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}.");
            }
        }
示例#2
0
        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}.");
            }
        }