Javascript: 这是真有符号整数除法吗
Javascript: Is This Truly Signed Integer Division
给定以下代码,其中 a
和 b
都是 Number
,表示有符号 32 位有符号整数范围内的值:
var quotient = ((a|0) / (b|0))|0;
并假设运行时完全符合 ECMAScript 6 规范,quotient
的值 总是 是 [=12 的正确带符号整数除法=] 和 b
作为整数?换句话说,这是在相当于机器指令的 JavaScript 中实现真正有符号整数除法的正确方法吗?
我不是浮点数方面的专家,但 Wikipedia 说双精度数有 52 位精度。从逻辑上讲,似乎 52 位应该足以可靠地近似 32 位整数的整数除法。
将最小和最大 32 位有符号整数 -2147483648 / 2147483647
相除得到 -1.0000000004656613
,这仍然是一个合理的有效数字量。它的倒数 2147483647 / -2147483648
也是如此,它产生 -0.9999999995343387
.
一个例外是,我在评论中提到过。正如链接的 SO 问题所述,整数除以零通常会引发某种错误,而浮点数强制转换会导致 (1 / 0) | 0 == 0
.
更新: 根据 another SO answer,C 中的整数除法截断为零,这就是 |0
在 JavaScript 中所做的。此外,除以 0 是未定义的,因此 JavaScript 在技术上返回零并不是不正确的。除非我遗漏了其他任何内容,否则原始问题的答案应该是肯定的。
更新 2: ECMAScript 6 规范的相关部分:如何 divide numbers and how to convert to a 32-bit signed integer, which is what |0
does.
给定以下代码,其中 a
和 b
都是 Number
,表示有符号 32 位有符号整数范围内的值:
var quotient = ((a|0) / (b|0))|0;
并假设运行时完全符合 ECMAScript 6 规范,quotient
的值 总是 是 [=12 的正确带符号整数除法=] 和 b
作为整数?换句话说,这是在相当于机器指令的 JavaScript 中实现真正有符号整数除法的正确方法吗?
我不是浮点数方面的专家,但 Wikipedia 说双精度数有 52 位精度。从逻辑上讲,似乎 52 位应该足以可靠地近似 32 位整数的整数除法。
将最小和最大 32 位有符号整数 -2147483648 / 2147483647
相除得到 -1.0000000004656613
,这仍然是一个合理的有效数字量。它的倒数 2147483647 / -2147483648
也是如此,它产生 -0.9999999995343387
.
一个例外是(1 / 0) | 0 == 0
.
更新: 根据 another SO answer,C 中的整数除法截断为零,这就是 |0
在 JavaScript 中所做的。此外,除以 0 是未定义的,因此 JavaScript 在技术上返回零并不是不正确的。除非我遗漏了其他任何内容,否则原始问题的答案应该是肯定的。
更新 2: ECMAScript 6 规范的相关部分:如何 divide numbers and how to convert to a 32-bit signed integer, which is what |0
does.