繁体   English   中英

在 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。

在 IEEE-754 binary32 编码中,0 是符号位,011 1101 1 是指数字段位,100 1100 1100 1100 1100 1101 是有效位字段位。

0 符号位表示正数。

指数字段位 011 1101 1 是 123 作为原始二进制。 指数以 127 的偏差编码,因此表示的指数为 123−127 = −4。

由于指数字段不为零(或全一,用于无穷大和 NaN),因此在有效数字字段位前加上 1,形成 1100 1100 1100 1100 1100 1101。作为原始二进制,这是 13,421,773。 有效数字以 2 23的比例编码,因此表示的有效数字为 13,421,773/2 23

结合符号、指数和有效数,表示的值为 +2 -4 •13,421,773/2 23 = 0.100000001490116119384765625。 这是表示的准确值,没有错误。 因此,您可以看到为其生成的数字“0.10000000149011612”是准确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM