2

Javascript

0/0       // NaN
0/0.0     // NaN
1/0.0     // Infinity
1/0.0     // Infinity

红宝石

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

Python

>>> 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 或 Infinity,而是所有错误?

4

3 回答 3

3

浮点除以零在许多环境中可能是异常(如果启用),但由于 IEEE 浮点能够表达一些异常值(如Inf, Nan),除以零也可能返回异常,而整数运算不能.

您还观察到不同语言的不同解析(或提升?)。0但是, JavaScript中的 bare浮点 0,而不是整数 0。

于 2013-02-21T23:13:52.587 回答
2

不同的语言做出不同的选择。

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

Python 显然禁止除以0或除以0.0. 在这个 SO question 中查看解决方法。

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

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

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

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

h = {0 => :foo}
h[0.0] # => nil
于 2013-02-21T23:24:29.290 回答
1

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

python 中的某些模块确实有这个,当它们合适的时候:

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])
于 2013-02-21T23:24:12.353 回答