问题描述
|
我需要在JavaScript中进行整数除法,这只能使我使用双精度浮点数。通常我只做
Math.floor(a / b)
(或a / b | 0
)并完成它,但是在这种情况下,我正在以锁步方式执行仿真,并且无论它们使用64位还是80位,都需要确保机器和运行时之间的一致性。内部精度。
到目前为止,我还没有发现任何不一致的地方,但是我无法最终说服自己相信它们不会发生。所以我想知道:
假设a
和b
分别是0..2 ^ 31-1和1..2 ^ 31-1范围内的整数,JavaScriptMath.floor(a / b)
(和a / b | 0
)的结果是否保证在机器和运行时之间是一致的?
为什么或者为什么不?
解决方法
我的猜测不会。答案将是它取决于许多因素:
ECMA脚本的浏览器供应商实施。
特定版本的ECMA脚本是否指定了一致性级别(通常不是)。
您可能不知道的最终用户计算机上的其他外部因素。
众所周知,浮点算术容易产生舍入误差。可以认为小数点右边的所有这些数字都是准确的,但让两台运行完全不同的硬件和软件配置的机器达成一致的计算就像放牧猫一样。