2015-07-11 18 views
10

鑑於下面的代碼,其中兩個ab是帶符號的32位帶符號整數的範圍內表示的值Number S:的Javascript:是這種真正符號整數除法

var quotient = ((a|0)/(b|0))|0; 

並假定運行時是完全符合ECMAScript 6規範,將quotient總是的值作爲整數是正確的有符號整數除法ab?換句話說,這是一種在JavaScript中實現真正的有符號整數除法的正確方法,它等同於機器指令?

+1

你有沒有試過尋找任何反例可能證明它*不是總是正確的? – Purag

+1

我沒有。由於JavaScript正式處理所有浮點,所以我將看到問題歸結爲,在32位有符號整數範圍內對兩個數學整數進行雙精度除法,然後截斷爲32位有符號整數和根據EMCAScript 6指定的ToInt32()抽象操作進行溢出模擬,相當於相同數學值的整數除法?我不認爲我理解浮點分割的過程足以自己回答這個問題,或者得到反例,這就是我在這裏問的原因。 – Textfield

+1

除以零除 - 不返回0而不拋出異常:https://stackoverflow.com/questions/29179876/how-does-asm-js-handle-divide-by-zero – gengkev

回答

4

我不是浮點數的專家,但Wikipedia說雙打有52位的精度。從邏輯上看,52位應該足以可靠地近似32位整數的整數除法。

劃分最小和最大32位帶符號整數,-2147483648/2147483647,產生-1.0000000004656613,這仍然是一個合理的有效位數。反過來也是如此,2147483647/-2147483648,其產生-0.9999999995343387

例外是division by zero,我在評論中提到。正如鏈接的SO問題所指出的那樣,整數除零通常引發某種錯誤,而浮點強制導致(1/0) | 0 == 0

更新:根據another SO answer,在C整數除法向零截斷,這是|0確實在JavaScript中。另外,由0除法是未定義的,所以JavaScript在返回零時在技術上並不正確。除非我錯過了其他的東西,否則對原始問題的回答應該是肯定的。

更新2: ECMAScript的6規範的有關章節:如何divide numbers以及如何convert to a 32-bit signed integer,這是what |0 does

相關問題