【问题标题】:Node Buffer.readFloatBE() extends data to 64-bitNode Buffer.readFloatBE() 将数据扩展到 64 位
【发布时间】:2020-03-21 05:10:18
【问题描述】:

当使用 32 位浮点数将数据与 Buffer 进行转换时,似乎 nodejs 使用一些使转换不可逆的标准将浮点数扩展为 double:

> 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 位双精度。

我了解将双精度数舍入为浮点数时,您会失去精度。以下所有数字在简化为浮点数时具有相同的编码值:

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】:

    0x75966b4f,转换成很多精度后,就是3.813579129065691e+32。

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

    某些语言滥用术语“浮点数”来表示任何浮点数。 IEEE-754 对“float”和“double”有特定的含义,如上。

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2012-11-24
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      相关资源
      最近更新 更多