グラフィックでfloatが使われるのは精度が求められないこと、メモリの節約、SIMDとの相性の良さ、
グラフィックライブラリやハードがfloat前提の設計になっているなどの理由かな。

byteじゃなくてlongへの変換だけどちょっと作ってみた。遅そうだ(笑
long hage(float f) {
  long *b = (long *) &f;
  int sign = (*b >> 31) & 0x00000001;
  int exp = (*b >> 23) & 0x000000ff;
  long frac = *b & 0x007fffff;
  if ((exp == 0) && (frac == 0)) return 0;
  if (exp == 0) return 0; // 非正規化数
  if (exp == 255) return -1; // 無限大 NaN
  // 正規化数
  char tmp = (exp - 127 - 23) & 0x0ff;
  exp = tmp; // 符号拡張
  frac |= 0x00800000;
  if (exp > 0) frac <<= exp;
  else frac >>= -exp;
  if (sign) frac = -frac;
  return frac;
}