code: func (m LinearFloatMapper) ID(fi ...interface{}) (rowIDs []int64, err error) {
  	f := fi[0].(float64)
  	externalID := int64(m.Res)
  
  	// bounds check
  	if f < m.Min || f > m.Max {
  		if m.allowExternal {
  			return []int64{externalID}, nil
  		}
  		return []int64{0}, fmt.Errorf("float %v out of range", f)
  	}
  
  	// compute bin
  	rowID := int64(m.Res * (f - m.Min) / (m.Max - m.Min))
  	return []int64{rowID}, nil
  }
docs: // ID maps floats to regularly spaced buckets