在 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 / 0
x !== 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 范围内的操作。如果a
、b
和 c
彼此相差一个数量级,并且想要显示精确到四位有效数字的总和,则知道 a+b+c
将是正确的 1ppm 以内的值一个 [实际精度实际上更好] 可能比一个精确的误差项更有帮助。【参考方案3】:
我意识到这是旧的,但我认为重要的是要注意,在 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
【讨论】:
有趣,但不完整。想想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?的主要内容,如果未能解决你的问题,请参考以下文章