| 6135 | var LN2 = Math.LN2; |
| 6136 | |
| 6137 | var pack = function (number, mantissaLength, bytes) { |
| 6138 | var buffer = $Array(bytes); |
| 6139 | var exponentLength = bytes * 8 - mantissaLength - 1; |
| 6140 | var eMax = (1 << exponentLength) - 1; |
| 6141 | var eBias = eMax >> 1; |
| 6142 | var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0; |
| 6143 | var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0; |
| 6144 | var index = 0; |
| 6145 | var exponent, mantissa, c; |
| 6146 | number = abs(number); |
| 6147 | // eslint-disable-next-line no-self-compare -- NaN check |
| 6148 | if (number !== number || number === Infinity) { |
| 6149 | // eslint-disable-next-line no-self-compare -- NaN check |
| 6150 | mantissa = number !== number ? 1 : 0; |
| 6151 | exponent = eMax; |
| 6152 | } else { |
| 6153 | exponent = floor(log(number) / LN2); |
| 6154 | c = pow(2, -exponent); |
| 6155 | if (number * c < 1) { |
| 6156 | exponent--; |
| 6157 | c *= 2; |
| 6158 | } |
| 6159 | if (exponent + eBias >= 1) { |
| 6160 | number += rt / c; |
| 6161 | } else { |
| 6162 | number += rt * pow(2, 1 - eBias); |
| 6163 | } |
| 6164 | if (number * c >= 2) { |
| 6165 | exponent++; |
| 6166 | c /= 2; |
| 6167 | } |
| 6168 | if (exponent + eBias >= eMax) { |
| 6169 | mantissa = 0; |
| 6170 | exponent = eMax; |
| 6171 | } else if (exponent + eBias >= 1) { |
| 6172 | mantissa = (number * c - 1) * pow(2, mantissaLength); |
| 6173 | exponent += eBias; |
| 6174 | } else { |
| 6175 | mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength); |
| 6176 | exponent = 0; |
| 6177 | } |
| 6178 | } |
| 6179 | while (mantissaLength >= 8) { |
| 6180 | buffer[index++] = mantissa & 255; |
| 6181 | mantissa /= 256; |
| 6182 | mantissaLength -= 8; |
| 6183 | } |
| 6184 | exponent = exponent << mantissaLength | mantissa; |
| 6185 | exponentLength += mantissaLength; |
| 6186 | while (exponentLength > 0) { |
| 6187 | buffer[index++] = exponent & 255; |
| 6188 | exponent /= 256; |
| 6189 | exponentLength -= 8; |
| 6190 | } |
| 6191 | buffer[index - 1] |= sign * 128; |
| 6192 | return buffer; |
| 6193 | }; |
| 6194 | |