UNPKG

@hqtsm/dataview

Version:
68 lines 1.69 kB
"use strict"; /** * @module * * 16-bit float operations. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.getFloat16 = getFloat16; exports.setFloat16 = setFloat16; let b; /** * Get 16-bit float. * * @param dataView Data view. * @param byteOffset Byte offset. * @param littleEndian Little endian. * @returns Float value. */ function getFloat16(dataView, offset, littleEndian = false) { let m = dataView.getUint16(offset, littleEndian); let s = m >> 8; let e = s & 127; s >>= 7; m = (e & 3) * 256 + (m & 255); if ((e >>= 2) === 31) { return m ? NaN : (s ? -Infinity : Infinity); } if (e) { m += 1024; e--; } m *= 2 ** (e - 24); return s ? -m : m; } /** * Set 16-bit float. * * @param dataView Data view. * @param byteOffset Byte offset. * @param value Float value. * @param littleEndian Little endian. */ function setFloat16(dataView, offset, value, littleEndian = false) { b ??= new DataView(new ArrayBuffer(4)); b.setFloat32(0, value); let f = b.getUint32(0); let v = f & 0x80000000; f ^= v; v >>= 16; if (f >= 0x47800000) { v |= 0x7c00 | (f > 0x7f800000 ? 512 | f >> 13 & 1023 : 0); } else if (f >= 0x33000000) { let e = f >> 23; if (f >= 0x38800000) { v |= e - 112 << 10 | f >> 13 & 1023; v += f >> 12 & (f << 20 ? 1 : v & 1); } else { e = 126 - e; f = f & 0x7fffff | 0x800000; v |= f >> e--; v += f >> e & (f << 32 - e ? 1 : v & 1); } } dataView.setUint16(offset, v, littleEndian); } //# sourceMappingURL=16.js.map