| 'use strict'; | 
| // IEEE754 conversions based on https://github.com/feross/ieee754 | 
| var $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 += 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 - 1] |= 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 += pow(2, mantissaLength); | 
|     exponent -= eBias; | 
|   } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength); | 
| }; | 
|   | 
| module.exports = { | 
|   pack: pack, | 
|   unpack: unpack | 
| }; |