gpt4 book ai didi

javascript - 关于 JavaScript TypedArray float32 的二进制格式

转载 作者:行者123 更新时间:2023-12-02 16:57:58 27 4
gpt4 key购买 nike

我需要用 JavaScript 编写一个硬件模拟器。它有自己的浮点格式,所以我在 JS 数字和该格式之间进行了大量的转换,这很慢。我有使用 JavaScript TypedArray float32 的想法,因为我可以直接访问形成 float32 浮点值的字节,该值与所需的格式相差不远,因此这种方式转换会快得多(只有一些移位等,使用 Uint8 Float32 的 View )。

但是,我不确定它的便携性如何。有关 TypedArray 主题的各种文档都指出 float32 就像“该硬件上的 native C 格式”等。但是我可以期望 float32 的确切二进制格式在运行某些浏览器/JS 的所有平台上都是相同的吗?我可以猜测字节序可能是一个问题,但如果至少没有其他差异,我可以处理这个问题。据我所知,使用的格式似乎是IEE754,但是在某些(好吧,至少不是那么奇特......)平台上可以使用其他格式在JS中实现float32?

我至少可以测试 x86 和 Apple A7 CPU,看起来它们非常相同,这很好,但也很奇怪,因为我认为这些 CPU 的字节顺序不同(至少可能不是 float 格式) ?)。然而,仅检查两个平台/操作系统/浏览器/其他内容,这远不是全局真理......

最佳答案

Float32Array 将根据主机系统的字节序(通常是小字节序)在内部表示值。

是的,格式是 IEEE 754(在 FPU 出现之前就已经存在了,它的变体涉及更多的宽度,即 64 位、80 位等)。 JavaScript 中的所有数字 (Number) 在内部都表示为 64 位 IEEE 754。对于类型化数组,32 位和 64 位 IEEE 754 当然都可用。

PowerPC 和 68k CPU 使用大端字节序(它应该是这样!:))。所谓的网络顺序也是big-endian,许多与平台无关的文件格式都是以big-endian字节顺序存储的(特别是音频和图形)。大多数主流计算机使用小端 CPU,例如 x86。因此,在结合使用这些的情况下,您很可能必须处理不同的字节顺序。

要处理字节顺序,您可以使用 DataView 来代替 Float32Array。

例如:

var buffer = new ArrayBuffer(10240);    // some raw byte buffer
var view = new DataView(buffer); // flexible view supporting endianness

现在您可以在考虑到字节顺序的情况下读取和写入缓冲区中的任何位置(DataView 还允许从/向非对齐位置读取/写入,即,如果需要,您可以将 Float32 值写入位置 3 .您不能使用 Float32/Uint32/Int16 等来执行此操作。)。

浏览器将在内部转换为正确的顺序 - 您只需按原样提供值:

view.setFloat32(pos, 0.5);              // big-endian
view.setFloat32(pos, 0.5, false) // big-endian
view.setFloat32(pos, 0.5, true); // little-endian

阅读时同样如此:

var n = view.getFloat32(pos);           // big-endian
var n = view.getFloat32(pos, false) // big-endian
var n = view.getFloat32(pos, true); // little-endian

提示:您可以在内部使用 native Float32Array,然后使用字节顺序对其进行读/写。这往往会更快,但如果生成的缓冲区的字节顺序与主机系统不同,则需要在最后使用 DataView 进行转换:

var f32 = new Float32Array(buffer);     // or use a size
f32[0] = 0.5;

然后确保您具有大端表示:

var view = new DataView(f32.buffer);
var msbVal = view.getFloat32(0): // returns 32-bit repres. in big-endian

希望能提供一些意见!如果您希望我详细说明某些部分,请向我提出相关问题。

关于javascript - 关于 JavaScript TypedArray float32 的二进制格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025215/

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