我需要在JavaScript中进行整数除法,这只能为我提供双精度浮点数。通常我会做Math.floor(a / b)
(或a / b | 0
)并完成它,但在这种情况下,我正在以锁步方式执行模拟,并且需要确保跨机器和运行时的一致性,无论它们是否使用64位或80位内部精度。
到目前为止,我没有注意到任何不一致的地方,但我无法确切地说服自己,他们不可能发生。所以我想知道:
假设a
和b
分别是范围0..2 ^ 31-1和1..2 ^ 31-1中的整数,则来自JavaScript Math.floor(a / b)
的结果(和a / b | 0
)保证在机器和运行时间保持一致吗?
为什么或为什么不呢?
答案 0 :(得分:2)
我的猜测是否定的。答案是,它取决于许多因素:
ECMA Script的浏览器供应商实施。
特定版本的ECMA脚本是否指定了一致性级别(通常不是)。
您可能不知道的最终用户机器上的其他外部因素。
浮点算法非常容易受到舍入误差的影响。虽然很高兴认为它在小数点右侧的所有数字都是准确的,但让两台机器运行完全不同的硬件和软件配置来同意计算可能就像放牧猫一样。