Skip to content Skip to sidebar Skip to footer

Buffer Reading And Writing Floats

When I write a float to a buffer, it does not read back the same value: > var b = new Buffer(4); undefined > b.fill(0) undefined > b.writeFloatBE(3.14159,0) undefined >

Solution 1:

Floating point numbers ("floats") are never a fully-accurate representation of a number; this is a common feature that is seen across multiple languages, not just JavaScript / NodeJS. For example, I encountered something similar in C# when using float instead of double.

Double-precision floating point numbers are more accurate and should better meet your expectations. Try changing the above code to write to the buffer as a double instead of a float:

var b = new Buffer(8);
b.fill(0);
b.writeDoubleBE(3.14159, 0);
b.readDoubleBE(0);

This will return:

3.14159

EDIT:

Wikipedia has some pretty good articles on floats and doubles, if you're interested in learning more:

SECOND EDIT:

Here is some code that illustrates the limitation of the single-precision vs. double-precision float formats, using typed arrays. Hopefully this can act as proof of this limitation, as I'm having a hard time explaining in words:

var floats32 = newFloat32Array(1),
    floats64 = newFloat64Array(1),
    n = 3.14159;

floats32[0] = n;
floats64[0] = n;

console.log("float", floats32[0]);
console.log("double", floats64[0]);

This will print:

float3.141590118408203double3.14159

Also, if my understanding is correct, single-precision floating point numbers can store up to 7 total digits (significant digits), not 7 digits after the decimal point. This means that they should be accurate up to 7 total significant digits, which lines up with your results (3.14159 has 6 significant digits, 3.141590118408203 => first 7 digits => 3.141590 => 3.141590 === 3.14159).

Solution 2:

readFloat in node is implemented in c++ and bytes are interpreted exactly the way your compiler stores/reads them. I doubt there is a bug here. What I think is that "7 digits" is incorrect assumption for float. This answer suggest 6 digits (and it's the value of std::numeric_limits<float>::digits10 ) so the result of readFloatBE is within expected error

Post a Comment for "Buffer Reading And Writing Floats"