UNPKG

@iotize/tap

Version:

IoTize Device client for Javascript

111 lines 9.81 kB
import { NumberConverter } from './number-converter'; export class FloatConverter { constructor(options) { this.options = options; } encode(value) { return NumberConverter.toOpaqueMsb(FloatConverter.toArray(value), 32); } decode(body) { return FloatConverter.toFloat(body); } /** * * @see https://stackoverflow.com/questions/3096646/how-to-convert-a-floating-point-number-to-its-binary-representation-ieee-754-i * @param number */ static toArray(number) { var n = +number, status = n !== n || n == -Infinity || n == +Infinity ? n : 0, exp = 0, len = 281, // 2 * 127 + 1 + 23 + 3, bin = new Array(len), signal = (n = status !== 0 ? 0 : n) < 0, n = Math.abs(n), intPart = Math.floor(n), floatPart = n - intPart, i, lastBit, rounded, j, exponent; if (status !== 0) { if (n !== n) { return 0x7fc00000; } if (n === Infinity) { return 0x7f800000; } if (n === -Infinity) { return 0xff800000; } } i = len; while (i) { bin[--i] = 0; } i = 129; while (intPart && i) { bin[--i] = intPart % 2; intPart = Math.floor(intPart / 2); } i = 128; while (floatPart > 0 && i) { (bin[++i] = (floatPart *= 2) >= 1 ? 1 : 0) && --floatPart; } i = -1; while (++i < len && !bin[i]) ; if (bin[(lastBit = 22 + (i = (exp = 128 - i) >= -126 && exp <= 127 ? i + 1 : 128 - (exp = -127))) + 1]) { if (!(rounded = bin[lastBit])) { j = lastBit + 2; while (!rounded && j < len) { rounded = bin[j++]; } } j = lastBit + 1; while (rounded && --j >= 0) { (bin[j] = !bin[j] - 0) && (rounded = 0); } } i = i - 2 < 0 ? -1 : i - 3; while (++i < len && !bin[i]) ; (exp = 128 - i) >= -126 && exp <= 127 ? ++i : exp < -126 && ((i = 255), (exp = -127)); (intPart || status !== 0) && ((exp = 128), (i = 129), status == -Infinity ? (signal = true) : status !== status && (bin[i] = 1)); n = Math.abs(exp + 127); exponent = 0; j = 0; while (j < 8) { exponent += n % 2 << j; n >>= 1; j++; } var mantissa = 0; n = i + 23; for (; i < n; i++) { mantissa = (mantissa << 1) + bin[i]; } return ((signal ? 0x80000000 : 0) + (exponent << 23) + mantissa) | 0; } static toFloat(val) { return FloatConverter.numberToFloat(NumberConverter.fromOpaqueMsb(val, 32)); } static numberToFloat(val) { var bits = 1 * val; var sign = (bits & 0x80000000) == 0 ? 1 : -1; var exponent = (bits & 0x7f800000) >> 23; var mantissa = bits & 0x007fffff; mantissa |= 0x00800000; var f = 1.0 * (sign * mantissa * Math.pow(2, exponent - 150)); return parseFloat(f.toFixed(5)); } static instance32() { if (!FloatConverter._instance32) { FloatConverter._instance32 = new FloatConverter(); } return FloatConverter._instance32; } } FloatConverter._instance32 = undefined; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvYXQtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vY2xpZW50L2ltcGwvc3JjL2xpYi9jb252ZXJ0ZXIvYm9keS9mbG9hdC1jb252ZXJ0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTXJELE1BQU0sT0FBTyxjQUFjO0lBS3pCLFlBQW1CLE9BQStCO1FBQS9CLFlBQU8sR0FBUCxPQUFPLENBQXdCO0lBQUcsQ0FBQztJQUV0RCxNQUFNLENBQUMsS0FBYTtRQUNsQixPQUFPLGVBQWUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQWdCO1FBQ3JCLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBYztRQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFDYixNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDNUQsR0FBRyxHQUFHLENBQUMsRUFDUCxHQUFHLEdBQUcsR0FBRyxFQUFFLHdCQUF3QjtRQUNuQyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQ3BCLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFDdkMsQ0FBQyxHQUFHLElBQUksQ0FBQyxH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