具有浮点运算的一致整数除法

Posted

技术标签:

【中文标题】具有浮点运算的一致整数除法【英文标题】:Consistent integer division with floating point operations 【发布时间】:2011-05-31 18:35:39 【问题描述】:

我需要在 javascript 中进行整数除法,这只能让我使用双精度浮点数。通常我只会做Math.floor(a / b)(或a / b | 0)并完成它,但在这种情况下,我正在做同步执行的模拟,并且需要确保机器和运行时之间的一致性,无论它们使用64位还是80 位内部精度。

到目前为止,我还没有注意到任何不一致之处,但我无法最终说服自己它们不会发生。所以我想知道:

    假设 ab 分别是 0..2^31-1 和 1..2^31-1 范围内的整数,则来自 JavaScript Math.floor(a / b)(和 a / b | 0)的结果保证跨机器和运行时保持一致?

    为什么或为什么不?

【问题讨论】:

【参考方案1】:

我的猜测是否定的。答案是它取决于许多因素:

    ECMA 脚本的浏览器供应商实现。

    特定版本的 ECMA 脚本是否指定一致性级别(通常不指定)。

    您可能不知道的最终用户计算机上的其他外部因素。

众所周知,浮点运算容易受到舍入误差的影响。虽然认为所有这些数字都在小数点右侧很准确,但让两台运行截然不同的硬件和软件配置的机器就计算达成一致可能就像放牧猫一样。

【讨论】:

以上是关于具有浮点运算的一致整数除法的主要内容,如果未能解决你的问题,请参考以下文章

JS 乘法运算出现了浮点,该怎么解决

为啥 nvprof 没有浮点除法运算的指标?

python // 与 / * 和 ** 运算符 的含义

js 浮点运算bug

java中整除和浮点除啥区别

解决浮点型数值计算精度丢失的一种实现