var assert = require('assert'); var topic = {"ChannelName":"t_amb","DeviceAddress":"c4:93:00:0a:8a:0d:01:99","DeviceType":"prostarsolar","GatewayAddress":"C493000A8A0D","TechName":"prostarsolar_[c4:93:00:0a:8a:0d:01:99]","TenantID":194}; var payload = {"Timestamp":1515422927,"Value":"0"}; var now = 1515422927; var lambda = function(topic, payload, now){ var inpValue = parseInt(payload.Value); var outValue; var binaryInput = Array(16).join("0") + inpValue.toString(2); var binRep = binaryInput.substring(binaryInput.length - 16); var sign = 1; var fraction; if (parseInt(binRep[0]) === 1){ sign = -1; } var exponent = parseInt(binRep.substring(1, 6), 2); if (exponent === 30.0){ fraction = parseInt("1".concat(binRep.substring(7, 17)), 2); } else { fraction = parseInt(binRep.substring(7, 17), 2); } if (exponent === 0){ outValue = sign * Math.pow(2,-14) * fraction / Math.pow(2.0, 10.0); } else if (exponent === 0b11111){ if (fraction == 0){ outValue = sign * Infinity; } else { outValue = NaN; } } else { var frac_part = 1.0 + fraction / Math.pow(2.0, 10.0); outValue = sign * Math.pow(2 , exponent - 15) * frac_part; } return outValue; } var intToFloat16 = function(intToConvert){ var binRep = pad(intToConvert.toString(2), 16, "0"); var sign = 1; var fraction; if (parseInt(binRep[0]) === 1){ sign = -1; } var exponent = parseInt(binRep.substring(1, 6), 2); if (exponent === 30.0){ fraction = parseInt("1".concat(binRep.substring(7, 17)), 2); } else { fraction = parseInt(binRep.substring(7, 17), 2); } // console.log("Sign: " + sign); // console.log("exponent: " + exponent + " -- " + binRep.substring(1, 6)); // console.log("fraction: " + fraction); if (exponent === 0){ return sign * (2 ** -14) * fraction / (2.0 ** 10.0); } else if (exponent === 0b11111){ if (fraction == 0){ return sign * Infinity; } else { return NaN; } } else { var frac_part = 1.0 + fraction / (2.0 ** 10.0); return sign * (2 ** (exponent - 15)) * frac_part; } } var pad = function(start, numChars, padWith){ var fullString = Array(numChars).join(padWith) + start; return fullString.substring(fullString.length - 16); } var test_values = [ [0b0000000000000000, 0.], [0b1000000000000000, -0.], [0b0011110000000000, 1], [0b0011110000000001, 1.0009765625], [0b1011110000000001, -1.0009765625], [0b1100000000000000, -2], [0b0100000000000000, 2], [0b0111101111111111, 65504.], [0b1111101111111111, -65504.], [0b0000010000000000, 6.10352e-5], [0b0000001111111111, 6.09756e-5], [0b0000000000000001, 5.96046e-8], [0b0111110000000000, Infinity], [0b1111110000000000, -Infinity], [0b0011010101010101, 0.333251953125] ] describe('intToFloat16', function(){ for (var i = 0; i < test_values.length; i++){ var testInput = test_values[i][0]; var expectedVal = test_values[i][1]; payload.Value = testInput; // var testVal = intToFloat16(testInput); var testVal = lambda(topic, payload, now); it("should return " + test_values[i][1] + " for " + test_values[i][0].toString(2) + " : " + testVal, function(){ assert.equal(testVal, expectedVal); }) } })