2014-09-24 39 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; 

然後確保你有大端表示:

​​

希望給予一些投入!如果你想讓我詳細說明一些部分,只需向我提出問題。