12 func (f *Float16) Pack(p []byte, opt *Options) (int, error) {
15 order = binary.BigEndian
22 if math.IsInf(float64(*f), 0) {
25 } else if math.IsNaN(float64(*f)) {
29 bits := math.Float64bits(float64(*f))
30 exp64 := (bits >> 52) & 0x7ff
32 exp = uint16((exp64 - 1023 + 15) & 0x1f)
34 frac = uint16((bits >> 42) & 0x3ff)
40 order.PutUint16(p, out)
43 func (f *Float16) Unpack(r io.Reader, length int, opt *Options) error {
46 order = binary.BigEndian
49 if _, err := r.Read(tmp[:]); err != nil {
52 val := order.Uint16(tmp[:2])
53 sign := (val >> 15) & 1
54 exp := int16((val >> 10) & 0x1f)
58 *f = Float16(math.NaN())
60 *f = Float16(math.Inf(int(sign)*-2 + 1))
64 bits |= uint64(sign) << 63
65 bits |= uint64(frac) << 42
67 bits |= uint64(exp-15+1023) << 52
69 *f = Float16(math.Float64frombits(bits))
73 func (f *Float16) Size(opt *Options) int {
76 func (f *Float16) String() string {
77 return strconv.FormatFloat(float64(*f), 'g', -1, 32)