Javascript: Is This Truly Signed Integer Division
给定以下代码,其中a和b都是Numbers,表示有符号32位有符号整数范围内的值:
1
| var quotient = ((a|0) / (b|0))|0; |
并且假设运行时完全符合ecmascript 6规范,那么quotient的值是否总是a和b作为整数的正确有符号整数除法?换言之,这是否是一种在JavaScript中实现与机器指令等效的真正有符号整数除法的适当方法?
- 你有没有试过寻找任何反例来证明这并不总是正确的?
- 我没有。因为javascript正式处理所有浮点,所以我会看到下面的问题:32位有符号整数范围内的两个数学整数的双精度除法的结果,然后是对32位有符号整数的截断和根据ToInt32()抽象操作规范的溢出模拟。由emcascript 6表示,相当于相同数学值的整数除?我觉得我对浮点除法的理解不够好,不能自己回答这个问题,也不能举出反例,这就是我在这里问的原因。
- 对于除数为零,否-返回0而不是引发异常:stackoverflow.com/questions/29179876/…
- Math.prototype.trunc可能有用
我不是浮点数专家,但维基百科说双打有52位精度。从逻辑上讲,52位应该足以可靠地近似32位整数的整数除法。
将最小和最大32位有符号整数-2147483648 / 2147483647除,生成-1.0000000004656613,这仍然是一个合理数量的有效数字。它的反义词2147483647 / -2147483648也一样,产生-0.9999999995343387。
一个例外是被零除,这是我在评论中提到的。正如链接的so-question所说,整数被零除通常会产生某种错误,而浮点强制则会导致(1 / 0) | 0 == 0。
更新:根据另一个so答案,c中的整数除法被截断为零,这就是|0在javascript中所做的。另外,除法0是未定义的,所以在技术上,javascript返回零是不正确的。除非我漏掉了其他的东西,否则原始问题的答案应该是"是"。
更新2:ecmascript 6规范的相关章节:如何划分数字以及如何转换为32位有符号整数,这就是|0所做的。