| | |
| | | // IEEE754 conversions based on https://github.com/feross/ieee754 |
| | | var global = require('../internals/global'); |
| | | |
| | | var Array = global.Array; |
| | | var abs = Math.abs; |
| | | var pow = Math.pow; |
| | | var floor = Math.floor; |
| | |
| | | var LN2 = Math.LN2; |
| | | |
| | | var pack = function (number, mantissaLength, bytes) { |
| | | var buffer = new Array(bytes); |
| | | var buffer = Array(bytes); |
| | | var exponentLength = bytes * 8 - mantissaLength - 1; |
| | | var eMax = (1 << exponentLength) - 1; |
| | | var eBias = eMax >> 1; |
| | |
| | | exponent = eMax; |
| | | } else { |
| | | exponent = floor(log(number) / LN2); |
| | | if (number * (c = pow(2, -exponent)) < 1) { |
| | | c = pow(2, -exponent); |
| | | if (number * c < 1) { |
| | | exponent--; |
| | | c *= 2; |
| | | } |
| | |
| | | exponent = 0; |
| | | } |
| | | } |
| | | for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8); |
| | | while (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); |
| | | while (exponentLength > 0) { |
| | | buffer[index++] = exponent & 255; |
| | | exponent /= 256; |
| | | exponentLength -= 8; |
| | | } |
| | | buffer[--index] |= sign * 128; |
| | | return buffer; |
| | | }; |
| | |
| | | var exponent = sign & 127; |
| | | var mantissa; |
| | | sign >>= 7; |
| | | for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8); |
| | | while (nBits > 0) { |
| | | exponent = exponent * 256 + buffer[index--]; |
| | | nBits -= 8; |
| | | } |
| | | mantissa = exponent & (1 << -nBits) - 1; |
| | | exponent >>= -nBits; |
| | | nBits += mantissaLength; |
| | | for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8); |
| | | while (nBits > 0) { |
| | | mantissa = mantissa * 256 + buffer[index--]; |
| | | nBits -= 8; |
| | | } |
| | | if (exponent === 0) { |
| | | exponent = 1 - eBias; |
| | | } else if (exponent === eMax) { |