【问题标题】:Is `Math.floor(a / a) == 1` guaranteed for any `a` such that `a / a` is not NaN?对于任何 `a` 是否保证 `Math.floor(a / a) == 1` 使得 `a / a` 不是 NaN?
【发布时间】:2018-10-27 23:42:10
【问题描述】:

考虑到浮点的不精确性,对于a 的任意数值,该等式是否保证为真,除法运算a / a 返回一个数值?

Math.floor(a / a) == 1

【问题讨论】:

  • a 为 0 时你试过这个吗?
  • Math.floor(Number.POSITIVE_INFINITY/Number.POSITIVE_INFINITY)NaNNumber.NEGATIVE_INFINITY 相同)
  • 我的意思是任何a,其中a / a 是一个数字。 (添加到问题中)
  • 请注意,由于 NaN 的特殊属性,a / a != NaN总是为真。
  • @ScottSauyet:问题标题当前指定“任何a 使得a / a != NaN”,这在技术上与“任何a”的含义相同。 (幸运的是,OP 的意图很清楚,这没什么大不了的;但我认为为了教育起见,值得指出。)

标签: javascript floating-point precision


【解决方案1】:

IEEE 754 指定运算的结果是精确的数学结果,四舍五入到最接近的可表示值(在用户可以指定的方向上——向上、最近等)。当精确的数学结果可表示时,它是最接近的值,并且没有四舍五入,因此结果是精确的。因此,只要不发生异常,a/a 就为 1。

如果我没记错的话,JavaScript 不允许实现使用过多的精度(例如,C 就是这样)。所以a/a 按预期进行评估。那么Math.floor(a/a) 为 1,Math.floor(a/a) == 1 为真。

【讨论】:

  • 而且,只有a 为 +/-0、+/-Inf 或 NaN 时才会发生异常。
【解决方案2】:

让我们试试吧

test(1);
test(0);
test(1E10000000000000000000)

function test(a) {
  console.log(a, Math.floor(a/a));
}

回答:没有

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2014-03-29
    • 2017-01-30
    • 2022-12-17
    • 2018-09-10
    相关资源
    最近更新 更多