在 NodeJS 中,如何将缓冲区中的 32 位浮点数编码为 (json) 字符串并保留原始精度?
In NodeJS, how to encode a 32 bits float number from a Buffer to a (json) string preserving original precision?
输入是一个包含单精度浮点数(32 位,小端)的缓冲区。
我想要生成的是一个包含这些数字的 JSON 字符串,保留完全相同的值而不更改精度。
问题是:一旦值存储在 JS number
中,它就会转换为 64 位,引入精度变化。
例如:
const buffer = Buffer.from("cdcccc3d", "hex"); // cdcccc3d is 0.1 in 32 bits float LE
console.log(buffer.readFloatLE(0)); // 0.10000000149011612 => bad
如何在不进行转换的情况下将此值作为保留原始精度的字符串获取?这里:"0.1"
.
如果我设法生成包含具有原始精度的数字的 JSON 字符串,则加分:{ "value": 0.1 }
.
小端字节 cd cc cc 3d 按大端顺序为 3d cc cc cd,或位 0011 1101 1100 1100 1100 1100 1100 1101。
在IEEE-754 binary32编码中,0为符号位,011 1101 1为指数位,100 1100 1100 1100 1100 1101为有效位。
0 符号位表示正。
指数字段位 011 1101 1 是 123 作为原始二进制。指数以 127 的偏差编码,因此表示的指数为 123−127 = −4.
由于指数字段不为零(或全部为 1,用于无穷大和 NaN),因此在有效数字字段位前加上 1,形成 1100 1100 1100 1100 1100 1101。作为原始二进制,这是13,421,773。有效数以 223 的比例进行编码,因此表示的有效数为 13,421,773/223.
组合符号、指数和尾数,表示的值为+2−4•13,421,773/223 = 0.100000001490116119384765625。这是表示的准确值,没有错误。所以你可以看到为它生成的数字“0.10000000149011612”就目前而言是准确的。
输入是一个包含单精度浮点数(32 位,小端)的缓冲区。
我想要生成的是一个包含这些数字的 JSON 字符串,保留完全相同的值而不更改精度。
问题是:一旦值存储在 JS number
中,它就会转换为 64 位,引入精度变化。
例如:
const buffer = Buffer.from("cdcccc3d", "hex"); // cdcccc3d is 0.1 in 32 bits float LE
console.log(buffer.readFloatLE(0)); // 0.10000000149011612 => bad
如何在不进行转换的情况下将此值作为保留原始精度的字符串获取?这里:"0.1"
.
如果我设法生成包含具有原始精度的数字的 JSON 字符串,则加分:{ "value": 0.1 }
.
小端字节 cd cc cc 3d 按大端顺序为 3d cc cc cd,或位 0011 1101 1100 1100 1100 1100 1100 1101。
在IEEE-754 binary32编码中,0为符号位,011 1101 1为指数位,100 1100 1100 1100 1100 1101为有效位。
0 符号位表示正。
指数字段位 011 1101 1 是 123 作为原始二进制。指数以 127 的偏差编码,因此表示的指数为 123−127 = −4.
由于指数字段不为零(或全部为 1,用于无穷大和 NaN),因此在有效数字字段位前加上 1,形成 1100 1100 1100 1100 1100 1101。作为原始二进制,这是13,421,773。有效数以 223 的比例进行编码,因此表示的有效数为 13,421,773/223.
组合符号、指数和尾数,表示的值为+2−4•13,421,773/223 = 0.100000001490116119384765625。这是表示的准确值,没有错误。所以你可以看到为它生成的数字“0.10000000149011612”就目前而言是准确的。