在 JavaScript 中,为什么零除以零返回 NaN,而其他除以零返回无穷大?

IT技术 javascript math floating-point nan infinity
2021-03-19 10:33:44

在我看来,代码

console.log(1 / 0)

应该返回NaN,但它返回Infinity但是这段代码:

console.log(0 / 0)

确实返回NaN有人可以帮助我理解此功能的原因吗?不仅看起来不一致,而且似乎是错误的,在x / 0where的情况x !== 0

3个回答

因为这就是定义浮点的方式(比 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。

@PatriciaShanahan:我喜欢的想法是,浮点值表示将被视为“向前”的确切数字的事物,但在许多情况下将表示其确切数值结果在范围内的运算的结果前向值的 1/2ulp。如果a, b, 和c彼此相差一个数量级,并且想要显示精确到四位有效数字的总和,知道这a+b+c将是一个在 1ppm 以内的正确值 [实际精度实际上更好] 可能更多比精确的误差项更有帮助。
2021-04-24 10:33:44
语言在这里很重要。小数不代表零,零不代表小数。这种措辞会导致人们错误地思考浮点近似值。对于数学结果很小的运算,浮点除法可能会返回零,但这是因为浮点除法被定义为返回最接近精确值的可表示值,而不是因为它被定义为近似表示商。每个浮点值只代表一个数字,而不是一个区间。
2021-04-27 10:33:44
@EricPostpischil 是和否。是的,IEEE 754 浮点算术定义明确,每次计算都有确定的结果,每个有限数都有一个值。不,因为那个系统,孤立地,将是无用的。在许多情况下,它能够对科学或工程计算的结果产生良好的近似值,而这些结果实际上是根据实数算术定义的。我会考虑如何改写我的答案以正确区分实数算术和浮点算术。
2021-05-20 10:33:44

我意识到这是旧的,但我认为这是需要注意的重要的一点是JS也有一个-0比不同0+0使JS的这一特点远不止逻辑乍一看。

1 / 0 -> Infinity
1 / -0 -> -Infinity 

这在逻辑上是有道理的,因为在微积分中,除以 0 的原因未定义仅仅是因为左极限为负无穷大,右极限为正无穷大。由于-00在 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

在评论部分,我没有空间包含产生相同结果的无限变化。相反,我使用了我能想到的最简单的形式,它创建了一个有问题的形状(和限制)的图形。
2021-04-28 10:33:44
@SMBiggs,为什么lim h -> 0 (h / h)而不是lim h -> 0 (2h / h)(例如)?没有一致的结果。
2021-04-30 10:33:44
有趣,但不完整。lim h -> 0 (h / h)由于JS有正负零,所以也应该有正负限制。因此只有 0/-0 和 -0/0 应该导致 NaN。其他的应该是正无穷大或负无穷大。当然,我心中的数学家还在哭得像个婴儿。
2021-05-02 10:33:44