I was working on trying to get the barometer readings from my TI SensorTag using Node.js when I came across this problem. See, the user's guide has two code examples for the algorithm for the pressure - one in C, and one in Java. The one in C uses primarily bit shift operations, whereas the one in Java uses
Math.pow() to do the same thing. Naturally, I tended towards the bit shift operations since it makes the code a bit clearer as to what it's doing (ultimately, from a performance perspective, it doesn't matter since
Math.pow(2, x) probably ultimately resolves to bit shifts anyway).
However, when I did this, I kept on getting pressure values that were all over the place. When I broke it down, it looked like the "offset" and "scale" factors, which rely heavily on bit shifts, were bouncing all over the place.
So, I did some looking, and discovered that, although Node.js stores all its variables as 64-bit floating point numbers, when it comes to bit operations, it does those as 32-bit numbers. A quick test showed that this is true:
> a = Math.pow(2, 31)-1 2147483647 > a >> 10 2097151 > a = Math.pow(2, 32) -1 4294967295 > a >> 10 -1 > a >> 2 -1
Notice the sharp transition once you hit that 32-bit border. What that meant was that any time I was doing bit operations, if the value I was operating on was less than 2^32, I got the right answer, otherwise I got garbage. Fun.
So, when I switched to the Java algorithm (modified, of course, because they seem to have forgotten to divide those values by 100 at the end) everything worked.
Good. To. Know.