| // IEEE754 conversions based on https://github.com/feross/ieee754 |
| // eslint-disable-next-line no-shadow-restricted-names |
| var Infinity = 1 / 0; |
| var abs = Math.abs; |
| var pow = Math.pow; |
| var floor = Math.floor; |
| var log = Math.log; |
| var LN2 = Math.LN2; |
| |
| var pack = function (number, mantissaLength, bytes) { |
| var buffer = new Array(bytes); |
| var exponentLength = bytes * 8 - mantissaLength - 1; |
| var eMax = (1 << exponentLength) - 1; |
| var eBias = eMax >> 1; |
| var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0; |
| var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0; |
| var index = 0; |
| var exponent, mantissa, c; |
| number = abs(number); |
| // eslint-disable-next-line no-self-compare |
| if (number != number || number === Infinity) { |
| // eslint-disable-next-line no-self-compare |
| mantissa = number != number ? 1 : 0; |
| exponent = eMax; |
| } else { |
| exponent = floor(log(number) / LN2); |
| if (number * (c = pow(2, -exponent)) < 1) { |
| exponent--; |
| c *= 2; |
| } |
| if (exponent + eBias >= 1) { |
| number += rt / c; |
| } else { |
| number += rt * pow(2, 1 - eBias); |
| } |
| if (number * c >= 2) { |
| exponent++; |
| c /= 2; |
| } |
| if (exponent + eBias >= eMax) { |
| mantissa = 0; |
| exponent = eMax; |
| } else if (exponent + eBias >= 1) { |
| mantissa = (number * c - 1) * pow(2, mantissaLength); |
| exponent = exponent + eBias; |
| } else { |
| mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength); |
| exponent = 0; |
| } |
| } |
| for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8); |
| exponent = exponent << mantissaLength | mantissa; |
| exponentLength += mantissaLength; |
| for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8); |
| buffer[--index] |= sign * 128; |
| return buffer; |
| }; |
| |
| var unpack = function (buffer, mantissaLength) { |
| var bytes = buffer.length; |
| var exponentLength = bytes * 8 - mantissaLength - 1; |
| var eMax = (1 << exponentLength) - 1; |
| var eBias = eMax >> 1; |
| var nBits = exponentLength - 7; |
| var index = bytes - 1; |
| var sign = buffer[index--]; |
| var exponent = sign & 127; |
| var mantissa; |
| sign >>= 7; |
| for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8); |
| mantissa = exponent & (1 << -nBits) - 1; |
| exponent >>= -nBits; |
| nBits += mantissaLength; |
| for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8); |
| if (exponent === 0) { |
| exponent = 1 - eBias; |
| } else if (exponent === eMax) { |
| return mantissa ? NaN : sign ? -Infinity : Infinity; |
| } else { |
| mantissa = mantissa + pow(2, mantissaLength); |
| exponent = exponent - eBias; |
| } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength); |
| }; |
| |
| module.exports = { |
| pack: pack, |
| unpack: unpack |
| }; |