在 JavaScript 中,为啥零除以零返回 NaN,而任何其他除以零返回 Infinity?

Posted

技术标签:

【中文标题】在 JavaScript 中,为啥零除以零返回 NaN,而任何其他除以零返回 Infinity?【英文标题】:In JavaScript, why does zero divided by zero return NaN, but any other divided by zero return Infinity?在 JavaScript 中,为什么零除以零返回 NaN,而任何其他除以零返回 Infinity? 【发布时间】:2013-09-21 05:02:23 【问题描述】:

在我看来,代码

console.log(1 / 0)

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

console.log(0 / 0)

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

【问题讨论】:

***.com/questions/3215120/… 有一个不错的教程here 任何数字都有无数个零,所以x / 0 === Infinity 对我来说似乎是合乎逻辑的。 【参考方案1】:

因为这就是定义浮点的方式(通常不仅仅是 javascript)。例如:

http://en.wikipedia.org/wiki/Floating-point#Infinities http://en.wikipedia.org/wiki/NaN#Creation

粗略地说,您可以将 1/0 视为 1/x 的极限,因为 x 趋于零(从右侧开始)。而 0/0 根本没有合理的解释,因此是 NaN。

【讨论】:

【参考方案2】:

除了基于零的数学概念的答案外,还有一个对浮点数的特殊考虑。每个下溢结果,每个绝对幅度太小而不能表示为非零数的非零数都表示为零。

0/0 可能实际上是 1e-500/1e-600,或 1e-600/1e-500,或许多其他非常小的值的比率。

实际比率可以是任何值,因此没有有意义的数字答案,结果应该是 NaN。

现在考虑 1/0。 0 代表 1e-500 还是 1e-600 无关紧要。无论如何,除法会溢出,正确的结果是用于表示溢出的值 Infinity。

【讨论】:

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

我意识到这是旧的,但我认为重要的是要注意,在 JS 中还有一个 -00+0 不同,这使得 JS 的这个特性比乍一看更合乎逻辑.

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

这在逻辑上是有道理的,因为在微积分中,除以 0 的原因是不确定的,仅仅是因为左极限趋于负无穷,右极限趋于正无穷。由于 -00 在 JS 中是不同的对象,因此将正 0 应用于正 Infinity 并将负 0 应用于负 Infinity 是有意义的

这个逻辑不适用于0/0,它是不确定的。与1/0不同,我们可以通过0/0这种方法得到两个限制结果

lim h->0(0/h) = 0
lim h->0(h/0) = Infinity

这当然是不一致的,所以结果是NaN

【讨论】:

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

以上是关于在 JavaScript 中,为啥零除以零返回 NaN,而任何其他除以零返回 Infinity?的主要内容,如果未能解决你的问题,请参考以下文章

模数返回除以零异常

为啥 C# 允许在浮点类型中将非零数除以零?

在此代码中,对于 while 循环内的条件,错误显示“除以零”。为啥会这样?

T-SQL为啥除以零不会在order by子句中产生错误

为啥这不会崩溃?我不是在这里除以零吗?

在java中的double和float类型数据相除为啥可以除以零