JavaScript 中浮点常量的高效编码
Efficient encoding for float constants in JavaScript
我正在 JavaScript 中编写信号处理演示。为此,我需要存储相对较大的浮点向量。如果我以一种天真的方式来做(使用 mathjs library):
var vector = math.matrix([-35.545806884765625, -3.1195175647735596, ...]);
它工作正常,但源很容易有兆字节。
有没有办法表示浮点数,例如,在 base64 编码中,以便压缩源代码?
一种选择是使用类型化数组并以十六进制序列化底层字节缓冲区(每个字节两位数)。不像 base64 那样 space 高效,但简单且没有所有 unicode 麻烦。
let data = new Float32Array([
-35.545806884765625,
-3.1195175647735596
]
);
console.log(data)
// encode
let encoded = '';
for (let x of new Uint8Array(data.buffer))
encoded += (x | 0x100).toString(16).slice(1);
console.log(encoded)
// decode
let bytes = new Uint8Array(
encoded
.match(/../g)
.map(x => parseInt(x, 16)));
let decodedData = new Float32Array(bytes.buffer)
console.log(decodedData);
如果您仍然需要 base64,MDN 提供了一些如何以正确的方式做到这一点的建议:https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
我正在 JavaScript 中编写信号处理演示。为此,我需要存储相对较大的浮点向量。如果我以一种天真的方式来做(使用 mathjs library):
var vector = math.matrix([-35.545806884765625, -3.1195175647735596, ...]);
它工作正常,但源很容易有兆字节。
有没有办法表示浮点数,例如,在 base64 编码中,以便压缩源代码?
一种选择是使用类型化数组并以十六进制序列化底层字节缓冲区(每个字节两位数)。不像 base64 那样 space 高效,但简单且没有所有 unicode 麻烦。
let data = new Float32Array([
-35.545806884765625,
-3.1195175647735596
]
);
console.log(data)
// encode
let encoded = '';
for (let x of new Uint8Array(data.buffer))
encoded += (x | 0x100).toString(16).slice(1);
console.log(encoded)
// decode
let bytes = new Uint8Array(
encoded
.match(/../g)
.map(x => parseInt(x, 16)));
let decodedData = new Float32Array(bytes.buffer)
console.log(decodedData);
如果您仍然需要 base64,MDN 提供了一些如何以正确的方式做到这一点的建议:https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding