| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | // IEEE754 conversions based on https://github.com/feross/ieee754var $Array = Array;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 = $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 -- NaN check  if (number != number || number === Infinity) {    // eslint-disable-next-line no-self-compare -- NaN check    mantissa = number != number ? 1 : 0;    exponent = eMax;  } else {    exponent = floor(log(number) / LN2);    c = pow(2, -exponent);    if (number * c < 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;    }  }  while (mantissaLength >= 8) {    buffer[index++] = mantissa & 255;    mantissa /= 256;    mantissaLength -= 8;  }  exponent = exponent << mantissaLength | mantissa;  exponentLength += mantissaLength;  while (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;  while (nBits > 0) {    exponent = exponent * 256 + buffer[index--];    nBits -= 8;  }  mantissa = exponent & (1 << -nBits) - 1;  exponent >>= -nBits;  nBits += mantissaLength;  while (nBits > 0) {    mantissa = mantissa * 256 + buffer[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};
 |