在我看来,代码
console.log(1 / 0)
应该返回NaN,但它返回Infinity。但是这段代码:
console.log(0 / 0)
确实返回NaN。有人可以帮助我理解此功能的原因吗?不仅看起来不一致,而且似乎是错误的,在x / 0where的情况下x !== 0
在我看来,代码
console.log(1 / 0)
应该返回NaN,但它返回Infinity。但是这段代码:
console.log(0 / 0)
确实返回NaN。有人可以帮助我理解此功能的原因吗?不仅看起来不一致,而且似乎是错误的,在x / 0where的情况下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不确定的 。与 with 不同1/0,我们可以通过这种方法得到两个限制结果0/0
lim h->0(0/h) = 0
lim h->0(h/0) = Infinity
这当然是不一致的,所以它导致 NaN