toHalf static method

int toHalf(
  1. double value
)

value as an IEEE half float's bits (rounded; clamped to its range).

Implementation

static int toHalf(double value) {
  final f = Float32List(1)..[0] = value;
  final bits = Uint32List.view(f.buffer)[0];
  final sign = (bits >> 16) & 0x8000;
  var exponent = ((bits >> 23) & 0xFF) - 127 + 15;
  var mantissa = bits & 0x7FFFFF;
  if (exponent <= 0) {
    if (exponent < -10) return sign;
    mantissa = (mantissa | 0x800000) >> (1 - exponent);
    return sign | ((mantissa + 0x1000) >> 13);
  }
  if (exponent >= 31) return sign | 0x7BFF; // the largest finite half
  final half = sign | (exponent << 10) | ((mantissa + 0x1000) >> 13);
  // Rounding up a mantissa of all ones carries into the exponent, as it
  // should; past the largest finite, clamp.
  return (half & 0x7C00) == 0x7C00 ? sign | 0x7BFF : half;
}