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.
		
		
		
		
			
				
					104 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					104 lines
				
				2.8 KiB
			| 
											11 months ago
										 | '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] |= 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 | ||
|  | }; |