You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							88 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							88 lines
						
					
					
						
							2.8 KiB
						
					
					
				// 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 | 
						|
};
 | 
						|
 |