Node Buffer.readFloatBE()将数据扩展到64位

问题描述 投票:0回答:1

[使用32位浮点数在缓冲区之间进行数据转换时,似乎nodejs使用一些使转换不可逆的条件将浮点数扩展为两倍。

> f=3.81357913e+32
3.81357913e+32

> b.Buffer.alloc(4)
<Buffer 00 00 00 00>

> b.writeFloatBE(f)
4

> b
<Buffer 75 96 6b 4f>

因此似乎原始值(3.81357913e + 32)表示为0x75966b4f(大端IEEE-754,单精度)现在,当您读取相同的值时,您将获得不同的值:

> b
<Buffer 75 96 6b 4f>

> b.readFloatBE()
3.813579129065691e+32

所以两个值是不同的。我希望这两个值是相同的。似乎readFloatBE()生成具有任意值的64位双精度。

我知道将双精度数四舍五入为浮点数时,会失去精度。以下所有数字减为float时,都具有相同的编码值:

3.813579129099999e+32  -> 0x75966b4f
3.813579129065691e+32  -> 0x75966b4f
3.813579129000000e+32  -> 0x75966b4f

...但是这个值(3.813579129065691e + 32)从哪里来?

(使用node.js v.11.12.0测试)

javascript node.js floating-point precision ieee-754
1个回答
0
投票
0x75966b4f,转换为很多精度时,为3.813579129065691e + 32。

通常,仅以可用的精度显示FLOAT,该精度约为7个十进制数字。看起来它们转换为双精度,添加零以填充为DOUBLE精度。通常会将其表示为约16个有效的十进制数字,例如3.813579129065691e + 32。

某些语言滥用术语“浮点数”来表示任何浮点数。如上所述,IEEE-754具有“浮点”和“双精度”的特定含义。

© www.soinside.com 2019 - 2024. All rights reserved.