【发布时间】: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