javascript:除以0和0.00 [关闭]

divided by 0 and 0.00 [closed]

Javascript

1
2
3
4
0/0       // NaN
0/0.0     // NaN
1/0.0     // Infinity
1/0.0     // Infinity

Ruby

1
2
3
4
>> 0/0     # ZeroDivisionError: divided by 0
>> 0/0.00  # NaN
>> 1/0.00  # Infinity
>> -1/0.00 # -Infinity

Python

1
2
3
4
>>> 0/0    # ZeroDivisionError: integer division or modulo by zero
>>> 0/0.0  # ZeroDivisionError: integer division or modulo by zero
>>> 1/0.0  # ZeroDivisionError: integer division or modulo by zero
>>> -1/0.0 # ZeroDivisionError: integer division or modulo by zero

这背后的原因是什么

整数不能被零整除,但浮点数可以吗?

在python中,为什么不是NaN或∞,而是所有的错误?


浮点数除0在许多环境中可能是一个异常(如果启用),但是由于IEEE float能够表示一些异常值(如InfNan),所以除0也可以返回一个异常值,而整数操作不能。

您还在观察不同语言中的不同解析(或提升)。然而,JavaScript中的裸0是一个浮点数0,而不是整数0。


不同的语言有不同的选择。

Javascript的情况很简单:整数存储为浮点数,并选择遵循IEEE-754除法规则。

Python显然禁止使用00.0进行除法。看这个问题的答案。

Ruby区分了精确的0和类似于0.0(或-0.0)的浮点数。实际上,0.0可以表示一个非常小的正数,它不能在浮点数(例如0.1e-400)的精度范围内表示。正是在这个视图中,1/0.1e-400返回Float::INFINITY,因为1e401太大,不能用任何其他浮点数表示。

Ruby实际上有两个不同的比较操作符来区分:

1
2
0 == 0.0 # => true
0.eql?(0.0) # => false

这可能会产生一些重要的后果:

1
2
h = {0 => :foo}
h[0.0] # => nil


And in python, why it's not a NaN or Infinity, but all errors?

python中的某些模块在适当的时候确实有这样的功能:

1
2
3
4
5
6
7
8
In [1]: import numpy as np

In [2]: a = np.arange(3)

In [3]: b = np.ones(3)

In [4]: b/a
Out[4]: array([ inf,  1. ,  0.5])