在我看来,代码
console.log(1 / 0)
应该返回
NaN
,但它却返回 Infinity
。然而这段代码:
console.log(0 / 0)
确实返回
NaN
。有人可以帮助我理解此功能的原因吗?它不仅看起来不一致,而且似乎也是错误的,在 x / 0
的情况下,其中 x !== 0
因为这就是浮点的定义方式(比 JavaScript 更普遍)。参见示例:
粗略地说,您可以将 1/0 视为 1/x 的极限,因为 x 趋于零(从右侧)。并且 0/0 根本没有合理的解释,因此 NaN。
除了基于零的数学概念的答案之外,还有对浮点数的特殊考虑。每个下溢结果,即绝对值太小而无法表示为非零数的每个非零数,都被表示为零。
0/0 实际上可能是 1e-500/1e-600,或 1e-600/1e-500,或许多其他非常小的值的比率。
实际比率可以是任何值,因此没有有意义的数值答案,结果应该是 NaN。
现在考虑 1/0。 0 代表 1e-500 还是 1e-600 并不重要。无论如何,除法都会溢出,正确的结果是用于表示溢出的值,Infinity。
我意识到这已经很旧了,但我认为值得注意的是,在 JS 中还有一个
-0
,它与 0
或 +0
不同,这使得 JS 的这个功能比乍一看更加合乎逻辑。
1 / 0 -> Infinity
1 / -0 -> -Infinity
这在逻辑上是有意义的,因为在微积分中,除以 0 是未定义的,仅仅是因为左极限为负无穷大,右极限为正无穷大。由于
-0
和 0
在 JS 中是不同的对象,因此应用正 0 来评估正 Infinity
和负 0 评估负 Infinity
是有意义的
这个逻辑不适用于
0/0
,它是不确定的。与 1/0
不同,我们可以通过 0/0
的方法得到两个取极限的结果
lim h->0(0/h) = 0
lim h->0(h/0) = Infinity
这当然是不一致的,所以会导致 NaN
在数学中,除法可以被认为是乘法的逆运算。当您将一个数字 a 除以另一个数字 b 时,您实际上是在尝试找出 b 可以放入 a 中多少次。然而,当您尝试除以零时,您是在问数字 a 可以容纳多少次零。由于零没有任何价值,因此不能用它来衡量它可以容纳任何数字的次数。这种情况在数学中造成了未定义或不确定的状态。
但是,在 JavaScript 和 IEEE 754 浮点标准 的上下文中,除以零的处理方式有所不同。当您将正数(例如 1)除以零时,结果是Infinity。这是因为,根据 IEEE 754 标准,数系扩展为正无穷大和负无穷大,从而允许计算极限。
这样想:当除数接近零时,除法的结果会无限增大。换句话说,结果接近无穷大。这就是为什么在 JavaScript(以及遵循 IEEE 754 标准的其他编程语言)中,正数除以零会得到无穷大
在微积分中,当您开始评估极限时,您会了解到,当 x 接近垂直渐近线时,垂直渐近线的极限会无限增加,或者,在极限表示法中,计算结果为无穷大。同时,0/0 被视为不确定形式。
因此,JavaScript 的推理基于极限微积分,而不是代数。