我觉得这段代码
console.log(1 / 0)
应该返回NaN
,但实际上它返回了Infinity
。然而,这段代码:
console.log(0 / 0)
does返回NaN
。有人能帮我理解这种功能的原因吗?它不仅似乎不一致,而且在x / 0
的情况下似乎是错误的,其中x!== 0
我觉得这段代码
console.log(1 / 0)
应该返回NaN
,但实际上它返回了Infinity
。然而,这段代码:
console.log(0 / 0)
does返回NaN
。有人能帮我理解这种功能的原因吗?它不仅似乎不一致,而且在x / 0
的情况下似乎是错误的,其中x!== 0
这是因为浮点数的定义方式如此(不仅仅是在Javascript中),请参见:
简而言之,你可以将1/0看作当x趋近于零时(从右侧)1/x的极限。而0/0则没有合理的解释,因此为NaN。
除了基于零的数学概念的答案外,浮点数还有特殊考虑。每个下溢结果,即任何绝对值过小而无法表示为非零数字的非零数字,都表示为零。
0/0可能真的是1e-500/1e-600、1e-600/1e-500或许多其他非常小的值的比值。
实际比率可以是任何值,因此没有意义的数字答案,结果应为NaN。
现在考虑1/0。无论0表示1e-500还是1e-600都没有关系。无论如何,除法都会溢出,正确的结果是用于表示溢出的值Infinity。
a
、b
和 c
相互接近,并且想要显示四个有效数字的总和,则知道 a+b+c
的值将在正确值的百万分之一范围内(实际精度实际上更好)可能比精确的误差术语更有帮助。 - supercat我知道这已经是老话题了,但我认为需要指出的是,在JS中还有一个-0
,它与0
或+0
有所不同,这使得JS的这个特性比一开始看起来更加合理。
1 / 0 -> Infinity
1 / -0 -> -Infinity
这在逻辑上是有意义的,因为在微积分中,除以0的原因是未定义的,仅仅是因为左极限趋向于负无穷大,右极限趋向于正无穷大。由于在JS中,-0
和0
是不同的对象,所以将正0应用于正无穷大的求值,将负0应用于负无穷大的求值是有意义的。
这种逻辑不适用于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。其他应为正无穷或负无穷。当然,我内心的数学家仍像婴儿一样哭泣。 - SMBiggslim h -> 0 (h / h)
而不是 lim h -> 0 (2h / h)
(例如)?这样做没有一致的结果。 - trincot
x / 0 === Infinity
对我来说是合理的。 - Ken Herbert