/** * 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, 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); }