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

在JavaScript中,为什么零除以零返回NaN,而任何其他除以零的返回无穷大?,javascript,math,floating-point,nan,infinity,Javascript,Math,Floating Point,Nan,Infinity,在我看来,代码 console.log(1 / 0) 应该返回NaN,但它会返回无限。但是,该代码: console.log(0 / 0) 确实返回NaN。有人能帮我理解这个功能的原因吗?在x/0wherex!==0,因为浮点是这样定义的(通常不只是Javascript)。例如,见: 粗略地说,你可以认为1/0是1/x的极限,因为x趋于零(从右边开始)。0/0根本没有合理的解释,因此NaN。除了基于数学概念零的答案外,还特别考虑了浮点数。每一个下溢结果,每一个绝对大小太小而无法表示为

在我看来,代码

console.log(1 / 0)
应该返回
NaN
,但它会返回
无限
。但是,该代码:

console.log(0 / 0)

确实返回
NaN
。有人能帮我理解这个功能的原因吗?在
x/0
where
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并不重要。无论如何,除法会溢出,正确的结果是用来表示溢出的值,无穷大。

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

1 / 0 -> Infinity
1 / -0 -> -Infinity 
这在逻辑上是有意义的,因为在微积分中,被0除的原因是没有定义的,仅仅是因为左极限是负无穷大,右极限是正无穷大。由于
-0
0
在JS中是不同的对象,因此将正0应用于正
无穷
,将负0应用于负
无穷

此逻辑不适用于不确定的
0/0
。与使用
1/0
不同,使用
0/0

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

这当然是不一致的,所以它导致了NaN

有一个不错的教程,任何数字中都有无穷多的零,所以
x/0===无穷
对我来说似乎是合乎逻辑的。语言在这里很重要。小数字不表示为零,零也不表示小数字。这种措辞会导致人们错误地思考浮点近似。对于数学结果很小的运算,浮点数除法可能返回零,但这是因为定义浮点数除法是为了返回最接近精确值的可表示值,而不是因为定义浮点数除法是为了近似表示商。每个浮点值只代表一个数字,而不是一个区间。@EricPostChil是和否。是的,IEEE 754浮点算法定义良好,每次计算都有一个明确的结果,每个有限数都有一个值。不,因为孤立地说,这个系统是无用的。在许多情况下,它能够产生科学或工程计算结果的良好近似值,这实际上是根据实数算术定义的,因此它具有实用价值。我会考虑如何改写我的答案,以正确区分实数算术和浮点算术。@PatriciaShanahan:我喜欢这样想,浮点值代表的是将被视为“向前”的精确数字,但在许多情况下,将表示精确数值结果在前进值1/2ulp范围内的操作结果。如果
a
b
c
彼此在一个数量级内,并且想要显示精确到四位有效数字的总和,那么知道
a+b+c
将是一个在正确数字1ppm范围内的值[实际上实际精度更好]可能比精确的误差项更有帮助。有趣的是,但不完整。思考
limh->0(h/h)
。因为JS有正零和负零,所以也应该有正极限和负极限。因此,只有0/-0和-0/0会导致NaN。其他的应该是正的或负的无穷大。当然,我内心的数学家仍然像婴儿一样哭泣。@SMBiggs,为什么
limh->0(h/h)
而不是
limh->0(2h/h)
(例如)?没有一致的结果。我在评论部分没有空间包括产生相同结果的无限变化。取而代之的是,我使用了我能想到的最简单的形式,它创建了一个有关形状(和限制)的图形。