2015-07-11 17 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

相关问题