File size: 787 Bytes
b2f2f57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * Read one float16 value returned by ONNX Runtime Web.
 *
 * Browsers without Float16Array expose raw IEEE-754 bits in a Uint16Array.
 * Safari exposes numeric values through Float16Array instead. Treating those
 * numeric values as bit patterns corrupts decoder argmax results.
 */
export function readFloat16(data: ArrayLike<number>, index: number): number {
  const value = data[index];
  if (!(data instanceof Uint16Array)) return Number(value);
  const sign = value & 0x8000 ? -1 : 1;
  const exponent = (value >> 10) & 0x1f;
  const fraction = value & 0x3ff;
  if (exponent === 0) return sign * 2 ** -14 * (fraction / 1024);
  if (exponent === 31) return fraction ? Number.NaN : sign * Number.POSITIVE_INFINITY;
  return sign * 2 ** (exponent - 15) * (1 + fraction / 1024);
}