除以0和0.00

时间:2013-02-21 23:10:12

标签: javascript python ruby

的Javascript

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

Ruby

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

3 个答案:

答案 0 :(得分:3)

浮点除以可以在许多环境中(如果启用)是一个例外,但由于IEEE float能够表达一些异常值(如Inf,{{1} })除零也可以返回异常,整数运算不能。

您还在观察不同语言的不同解析(或推广?)。但是,JavaScript 中的裸Nan 是浮点0而不是整数零。

答案 1 :(得分:2)

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

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

Python显然禁止按00.0进行划分。了解这个in this 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

答案 2 :(得分: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])