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.