2012-08-23 73 views
4

編譯使用Emscripten此代碼:如何使用JavaScript模擬x86無符號32位整數乘法?

#include <stdio.h> 
int main() { 
unsigned long d1 = 0x847c9b5d; 
unsigned long q = 0x549530e1; 
printf("%lu\n", d1*q); 
return 0; 
} 

收益率(使用-g):

$d1=-2072208547; //@line 3 "minusmul.c" 
    $q=1419063521; //@line 4 "minusmul.c" 
    var $2=$d1; //@line 5 "minusmul.c" 
    var $3=$q; //@line 5 "minusmul.c" 
    var $4=((($2)*($3))|0); //@line 5 "minusmul.c" 

執行此使用js(?SpiderMonkey的,我相信)或node,我得到的結果3217488896。執行本地可執行文件(使用GCC編譯),我得到3217489085。如何使用JavaScript模擬x86無符號32位整數乘法?

+1

重複http://stackoverflow.com/questions/6232939/is-there-a-way-to-correctly-multiply-two-32-bit-integers-in-javascript/6422061 –

+0

我發佈了一個答案[重複問題](http://stackoverflow.com/questions/6232939/is-there-a-way-to-correctly-multiply-two-32-bit-integers-in-javascript/6422061)。 –

回答

1

Emscripten不支持精確的32位乘法,或者它是一個錯誤。由於他們在主頁上提到他們有64位數學軟件模擬,我認爲這是一個錯誤。我發現你可以使用CHECK_OVERFLOWS,它會發現溢出。它似乎並沒有「修復」它。要使用CHECK_OVERFLOWS完成程序,您需要增加計數,並在生成的源文件中標記爲「XXX」。

+0

確定事實證明這是一個錯誤。 [https://github.com/kripken/emscripten/commit/c14a675125a6d94d80561e98​​6549280eee5e958d],[問題在這裏] –

1

JavaScript使用IEEE-754標準(see also)作爲其內部編號表示。這是浮點運算,所以你將不得不拿出你自己的庫函數來模擬大整數的位運算。存在幾個庫,例如BigIntBigNumber

+0

單精度浮點數可以表示0到2^32-1 AFAIK之間的所有數字,所以我沒有看到我需要BigInts。 –

+1

關於這個話題有很多討論。看到http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-t –

相關問題