fp16
Version:
Half-precision 16-bit floating point numbers
40 lines (39 loc) • 1.18 kB
JavaScript
import { float32View } from "./utils.js";
export function getFloat16(view, offset, littleEndian) {
const value = view.getUint16(offset, littleEndian);
const sign = value & 0x8000;
const exponent = value & 0x7c00;
const mantissa = value & 0x03ff;
if (exponent === 0) {
if (mantissa === 0) {
return sign ? -0 : 0;
}
else {
let e = 127 - 14;
let m = mantissa;
while ((m & 0x400) === 0) {
e--;
m <<= 1;
}
m &= ~0x400;
const i = (sign << 16) | (e << 23) | (m << 13);
float32View.setInt32(0, i, littleEndian);
return float32View.getFloat32(0, littleEndian);
}
}
else if (exponent === 0x7c00) {
if (mantissa === 0) {
return sign ? -Infinity : Infinity;
}
else {
return NaN;
}
}
else {
const e = (exponent + 0x01c000) << 13;
const m = mantissa << 13;
const i = (sign << 16) | e | m;
float32View.setInt32(0, i, littleEndian);
return float32View.getFloat32(0, littleEndian);
}
}