gpt4 book ai didi

javascript - 缓冲区读写 float

转载 作者:搜寻专家 更新时间:2023-10-31 23:38:29 26 4
gpt4 key购买 nike

当我将 float 写入缓冲区时,它不会读回相同的值:

> var b = new Buffer(4);
undefined
> b.fill(0)
undefined
> b.writeFloatBE(3.14159,0)
undefined
> b.readFloatBE(0)
3.141590118408203
>
(^C again to quit)
>

为什么?

编辑:

我的工作理论是,因为 javascript 将所有数字存储为 double ,所以缓冲区实现可能在读回 float 时没有正确地将 double 的其他 4 个字节归零:

> var b = new Buffer(4)
undefined
> b.fill(0)
undefined
> b.writeFloatBE(0.1,0)
undefined
> b.readFloatBE(0)
0.10000000149011612
>

我认为这表明小数点后 7 位数字为零(嗯,实际上是 8 位),然后是垃圾。我认为读取这些 float 的 Node 缓冲区代码中存在错误。那就是我所想的。这是 Node 版本 0.10.26。

最佳答案

float (“ float ”)从来都不是数字的完全准确表示;这是跨多种语言的常见功能,而不仅仅是 JavaScript/NodeJS。例如,当我使用 float 而不是 double 时,我在 C# 中遇到了类似的问题。

double float 更准确,应该能更好地满足您的期望。尝试更改上面的代码以将缓冲区作为 double 而不是 float 写入缓冲区:

var b = new Buffer(8);
b.fill(0);
b.writeDoubleBE(3.14159, 0);
b.readDoubleBE(0);

这将返回:

3.14159

编辑:

维基百科有一些关于 float 和 double 的非常好的文章,如果你有兴趣了解更多:

第二次编辑:

下面是一些代码,说明了使用类型化数组时单精度浮点格式与 double 浮点格式的局限性。希望这可以作为这种限制的证明,因为我很难用语言来解释:

var floats32 = new Float32Array(1),
floats64 = new Float64Array(1),
n = 3.14159;

floats32[0] = n;
floats64[0] = n;

console.log("float", floats32[0]);
console.log("double", floats64[0]);

这将打印:

float 3.141590118408203
double 3.14159

此外,如果我的理解是正确的,单精度 float 最多可以存储 7 total 位(有效数字),而不是小数点后的 7 位。这意味着它们应该精确到总共 7 位有效数字,这与您的结果一致(3.14159 有 6 位有效数字,3.141590118408203 => 前 7 位数字 => 3.141590 => 3.141590 === 3.14159).

关于javascript - 缓冲区读写 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27097835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com