Math.floor(x/y) 是确定性的吗?

Posted

技术标签:

【中文标题】Math.floor(x/y) 是确定性的吗?【英文标题】:Is Math.floor(x/y) deterministic? 【发布时间】:2019-02-22 20:56:20 【问题描述】:

根据this 的帖子,javascript 中的浮点数不是确定性的。

我想知道,下面的代码是确定性的吗?

z = Math.floor(x/y)

如果不是,如何在 JavaScript 中进行确定性整数除法?

编辑:我想知道我是否可以依赖不同 JavaScript 实现的结果值相同(假设它们遵循标准)。

【问题讨论】:

“依赖于实现”和“非确定性”不是完全相同的概念。后者往往指的是依赖于随机数的函数,这不是这里真正的问题。 澄清一下:在我的问题中,我要求一种在javascript中划分整数的独立于实现的方法 你的问题非常清楚,只是不是我所期望的标题。 【参考方案1】:

它应该是确定性的。

根据the specification

20.2.2.16 Math.floor (x)

返回不大于 x 且等于数学整数的最大(最接近 +∞)数值。如果 x 已经是整数,则结果为 x。

如果 x 为 NaN,则结果为 NaN。 如果 x 为 +0,则结果为 +0。 如果 x 为 -0,则结果为 -0。 如果 x 为 +∞,则结果为 +∞。 如果 x 为 -∞,则结果为 -∞。 如果 x 大于 0 但小于 1,则结果为 +0。

注意 Math.floor(x) 的值与-Math.ceil(-x) 的值相同。

当底层引擎使用更高精度的数字时,某些数学函数的不确定性与可能的舍入问题有关。这不应该是一个因素。

更新

部门是also deterministic。这里的 JS 规范依赖于 IEEE 754 规范。但该规范是确定性的。 (抱歉没有链接,因为实际规格是付费的。)

不确定性在于不太常见的 JS 函数。

【讨论】:

如果我理解正确,x / y 可能会根据架构产生不同的值。这些舍入误差会通过 Math.floor 函数“泄漏”吗? 已更新。我从未真正阅读过 IEEE 754 规范,但有人告诉我,它的除法算法也是确定性的。【参考方案2】:

是的。 Math.floor 总是返回一个最低的 integer 值。

虽然这不是确定性的: z = 3/1.5; //z !== 2

根据函数的设计,这是: z = Math.floor(3/1.5); //z === 2

更多详情请见the MDN docs。

【讨论】:

以上是关于Math.floor(x/y) 是确定性的吗?的主要内容,如果未能解决你的问题,请参考以下文章

双色球的随机

JavaScript Math 对象

JS:Math 对象方法

JavaScript Math对象方法

javascript中Math函数的属性与方法

Python内置数据类型