鉴于下面的代码,其中两个a
和b
是带符号的32位带符号整数的范围内表示的值Number
S:的Javascript:是这种真正符号整数除法
var quotient = ((a|0)/(b|0))|0;
并假定运行时是完全符合ECMAScript 6规范,将quotient
总是的值作为整数是正确的有符号整数除法a
和b
?换句话说,这是一种在JavaScript中实现真正的有符号整数除法的正确方法,它等同于机器指令?
鉴于下面的代码,其中两个a
和b
是带符号的32位带符号整数的范围内表示的值Number
S:的Javascript:是这种真正符号整数除法
var quotient = ((a|0)/(b|0))|0;
并假定运行时是完全符合ECMAScript 6规范,将quotient
总是的值作为整数是正确的有符号整数除法a
和b
?换句话说,这是一种在JavaScript中实现真正的有符号整数除法的正确方法,它等同于机器指令?
我不是浮点数的专家,但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。
你有没有试过寻找任何反例可能证明它*不是总是正确的? – Purag
我没有。由于JavaScript正式处理所有浮点,所以我将看到问题归结为,在32位有符号整数范围内对两个数学整数进行双精度除法,然后截断为32位有符号整数和根据EMCAScript 6指定的ToInt32()抽象操作进行溢出模拟,相当于相同数学值的整数除法?我不认为我理解浮点分割的过程足以自己回答这个问题,或者得到反例,这就是我在这里问的原因。 – Textfield
除以零除 - 不返回0而不抛出异常:https://stackoverflow.com/questions/29179876/how-does-asm-js-handle-divide-by-zero – gengkev