2014-09-24 90 views
0

我需要在JavaScript中编写一个硬件模拟器。它有它自己的浮点格式,所以我在JS数字和格式之间做了很多转换,这很慢。我的想法是使用JavaScript TypedArray float32,因为我可以直接访问形成float32浮点值的字节,这与所需的格式相差不大,所以转换速度会更快(只有一些转换等,使用Uint8 Float32的视图)。关于JavaScript的二进制格式TypedArray float32

但是,我不确定它是多么便携的解决方案。有关TypedArray主题的各种文档声明float32就像“该硬件上的本地C格式”等。但是,我可以期望float32的确切二进制格式在运行某些浏览器/ JS的所有平台上都是相同的吗?我猜可能endiannes是一个问题,但如果至少没有其他区别,我可以处理这个问题。据我所知,使用的格式似乎是IEE754,但也有其他人可以用来在JS中实现float32(在某些情况下,至少不是那么奇特的)平台?

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

回答

2

Float32Array将在内部表示基于主机系统永恒性的值,通常是小端。

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

PowerPC和68k CPU使用big-endian(它应该是!:)的方式)。所谓的网络顺序也是大端的,许多与平台无关的文件格式以大端字节顺序存储(尤其是音频和图形)。大多数主流电脑都使用x86这样的小端CPU。所以在这些情况下,你很可能不得不处理不同的字节顺序。

要处理这种情况,您可以不使用Float32Array,而使用DataView

例如:

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

现在,你现在可以读取并牢记字节顺序写入任何位置在缓冲区(数据视图还允许读/ /写入到非对齐位置,即。如果需要,可以将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 

提示:您可以使用原生Float32Array内部使用Endianess进行读取/写入。这往往是速度更快,但它需要使用数据视图在最后转换,如果得到的缓冲区的字节顺序是从主机系统不同:

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

然后确保你有大端表示:

​​

希望给予一些投入!如果你想让我详细说明一些部分,只需向我提出问题。