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.
		
		
		
		
		
			
		
			
				
					
					
						
							103 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							103 lines
						
					
					
						
							2.8 KiB
						
					
					
				| '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 | |
| };
 |